{"_id":"wechaty-redux","_rev":"54-7c3b43b0cc877cab847da7fe7d19fc9c","name":"wechaty-redux","dist-tags":{"next":"1.19.7","latest":"1.20.2"},"versions":{"0.1.0":{"name":"wechaty-redux","version":"0.1.0","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/index.js","typings":"dist/src/index.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0","redux":"^4.0.5","redux-observable":"^1.2.0","rxjs":"^6.5.5"},"peerDependencies":{"wechaty":"^0.39.40"},"devDependencies":{"@chatie/eslint-config":"^0.8.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.10.1","ducks":"^0.6.1","pkg-jq":"^0.2.4","shx":"^0.3.2","tstest":"^0.4.10","utility-types":"^3.10.0","wechaty":"^0.39.40"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"c29fd2f7744401a8ceb85c41f7222351c633dd70","_id":"wechaty-redux@0.1.0","_nodeVersion":"12.16.3","_npmVersion":"6.14.4","dist":{"integrity":"sha512-eXkRM/m6LG/YvBw7z3Iy/XpXDGiCje4i+E5vziCMdq75DoBl6v9Ep7CUnBrzIwNkSahj1OP0x6PeJizPpsX3pQ==","shasum":"ec245868c670026ce6f34b99dc7325c1ab1b3575","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.1.0.tgz","fileCount":93,"unpackedSize":439630,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe1VU5CRA9TVsSAnZWagAAqukQAITtNndDQPMNySp8/caG\n4EI9Z1rOBaPU3OJqUXsjw631R/q1PmHBT8Z5gKm/lf03UOh/owNAyYhPJxzy\n45ahv363nH3YTueeaQNJivJpxhRjNjmg4lrbD+BASHvIJVGugM8hza3cQcik\nqkG31iLdtNeyqS22oKDigXPnTL4+t/UevzbaKicc9weI6cKJXNN13/p9is+u\nHJ64ehnqDNHvxdIBmhRig1n5Obkkb379LzR/mv7z7CZKSvv2EyC8TjEXhhcD\njEdIbOr25TBckGJIJ4vy+vaDKo/iOry/FQFSdfQN1xo7q+nrZI0UoyMscr6s\n4TJZAfn9LFT21on43LF4Hko32M3yIwNtdLeaaV5d90fSiTQqyhv3DscRpm1D\nQfvbEbogVqrsyII+DQrzOppNpGetPAV4mE8L0dmIHyF6HSUzeqWZhI8rGLuE\n3UA75+3wvcqqyd/mBmvd/rIoKKnCtlvwOxBs+Vs2a6dunycqsQzQAH1mEdtm\nBayEr/O+hDFA7v4PoveZ4TQcfg6OmnRHbSbb3U3mgKY0fQIC1rtVBFjr+EZU\nV2rdiGUHKFDeFMWs/S/CCwXsaW03HXk3bOhfgV9wu24I3kKQ54hdpLF7ejAu\nBOaI0zXWXJa1CrFzhm45UJ6l8RWwBqYM9Cj3xSY5ZEC6i08g8ryFrSzLWhhB\nwhwu\r\n=YI0B\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDFKv07U9fFP7sS8hMaJcHkybexFPsHbELK3J7c98wvmwIgc62MX5RytHyXo3XuTpqc278AsUHXP9qUgqDl2fcuo1c="}]},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.1.0_1591039288670_0.4885485370665217"},"_hasShrinkwrap":false},"0.1.1":{"name":"wechaty-redux","version":"0.1.1","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/index.js","typings":"dist/src/index.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0","redux":"^4.0.5","redux-observable":"^1.2.0","rxjs":"^6.5.5"},"peerDependencies":{"wechaty":"^0.39.40"},"devDependencies":{"@chatie/eslint-config":"^0.8.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.10.1","ducks":"^0.6.1","pkg-jq":"^0.2.4","shx":"^0.3.2","tstest":"^0.4.10","utility-types":"^3.10.0","wechaty":"^0.39.40"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Wechaty Plugin\n\n```ts\nimport {\n  WechatyRedux,\n  api as wechatyApi,\n}                     from 'wechaty-redux'\nimport { Wechaty }     from 'wechaty'\nimport { Ducks }       from 'ducks'\n\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\n\nconst ducks       = new Ducks({ wechaty: wechatyApi })\nconst store       = ducks.configureStore()\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nbot.use(WechatyRedux({ store }))\n\nstore.subscribe(() => console.info(store.getState()))\nstore.dispatch(wechatyDuck.actions.ding('redux!'))\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### v0.1 (Jun 2, 2020)\n\nInitial version.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020-now Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"edefad2c1d55606b415a8c168d339f5d2c871180","_id":"wechaty-redux@0.1.1","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-8DOD7Sw5CsKGj/Flqfd238DXTz2Wh6lriP5UvsJNK391Z0aKlLzC212R6ZK4opB4/RJp1bcux6OXWdInv/fvtQ==","shasum":"d9f8ec10c4df712d1dcc84d34898c843fdf56c48","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.1.1.tgz","fileCount":93,"unpackedSize":439557,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe1Vk2CRA9TVsSAnZWagAAJqAP/RZ82qZZbacgz6/JtWMC\n4lB6KGQdg5GScDVmKYf/8gHPJRak9p7Vv/YyVPjb/LF1x4jxIwFJGv4gDK33\nsDPm3baDvv8X5wAKS/Lfi1+pyeg/MVSfFJTNovFqXqUEzHtJYVLZh82mFTtX\n6B2jSY15KUm3HMFG+XhLGSKgIR5IGu7zda+zDGnDcvG5nQdVM5FrC4qYQtbV\nUYmRxgysNP3NClmRg78U4yxTacHkS4IYWmSVSnkeFWuG6o9A0GsJWnDn7Ad7\nG+lORllo7o6Eb4NFshpXBlklIh7/66J39w+j6LbtYG+mhJd9QrsY8LuzDuuv\nJFpCb+ZPeHnLE4A0J00D6edOlKl3+aPUmo/Bp1bY/Y6mUf3TMYLyJZOJJEUu\ni/EoTsZxhVvuyVrmrUjfGB3hEhfnAz9ehu5AC8bVjwiQWCQ3qSeygPiM8t30\nFtLKl+w9skXdI4TuVLsWU1ZYyy+GDpCkOE936jxs9/CNN82VSve/+TAP5KsZ\nYmhxWCrmYF0iIwzlvMjPntmZSpnFj38rPyml9XCBisWHl8BL0ypbbU/FrtRv\n6n/GQL/UsLJ2Gu+K5YJxEgCybTtvEvJbRp/LEAwjyx/1c7sTYvFim+lBZUno\nr8LQtJjCJ2wTHltyPUjlGO/bLVazWXl5PQ8CzKWTMrjDjRaJAV/l2Egusy5S\no6O8\r\n=V/cm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBIYTp4PZGBK5feSgodfJ6FzD/OAtEIAuxNx8pa49JgKAiBeTQORxvIj9JR3EyPjRg6A23QyOJrbe8e4CDtDN7TCAA=="}]},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.1.1_1591040309685_0.616560242899437"},"_hasShrinkwrap":false},"0.1.2":{"name":"wechaty-redux","version":"0.1.2","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/index.js","typings":"dist/src/index.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0","redux":"^4.0.5","redux-observable":"^1.2.0","rxjs":"^6.5.5"},"peerDependencies":{"wechaty":"^0.39.40"},"devDependencies":{"@chatie/eslint-config":"^0.8.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.10.1","ducks":"^0.6.1","pkg-jq":"^0.2.4","shx":"^0.3.2","tstest":"^0.4.10","utility-types":"^3.10.0","wechaty":"^0.39.40"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Wechaty Plugin\n\n```ts\nimport {\n  WechatyRedux,\n  api as wechatyApi,\n}                     from 'wechaty-redux'\nimport { Wechaty }     from 'wechaty'\nimport { Ducks }       from 'ducks'\n\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\n\nconst ducks       = new Ducks({ wechaty: wechatyApi })\nconst store       = ducks.configureStore()\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nbot.use(WechatyRedux({ store }))\n\nstore.subscribe(() => console.info(store.getState()))\nstore.dispatch(wechatyDuck.actions.ding('redux!'))\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### v0.1 (Jun 2, 2020)\n\nInitial version.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"4853b4ff1c68474eaf98856365cd23b3bad74b29","_id":"wechaty-redux@0.1.2","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-Zj+BhZ0OWXubrOK1uFG0OhJSN0Lk2TrfrNjFUIjd5VwDYDLFkmPUs/QKDkzrb/ekTv8UUFj3RvkDQp7xaAzRzw==","shasum":"1dc9954f74ab837151afbdd9b54196152976481e","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.1.2.tgz","fileCount":94,"unpackedSize":464114,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe1V3QCRA9TVsSAnZWagAAlkoP/0j9EWHkrmyFlq//RYZo\nGp1B76ByZEVW8xsRO57jOo+74ISBenbaZ8G16xViiKysNkNFgSjkzfosKosA\ngkghUpTZMBLa1359aWYKlFpRF+Uzk1orDXkpfysiJPyPnXVZp49O0x0OSsX4\nb46B1o8yU3qfYOfoVZmGfmkBvBFgBN9FMVn8hLnjX3b/m2NOx8t6Z72oKcjc\nPCVpd+6X6vdlfzaaO08UnYBvCpkWVbKEOyAuKkhf9oTU2s3BFQZz60HbVU8+\n5tfeT7cAvyFOOCKH/m2zuytYGzm1BGw9RtNhRKQUgG/KBoqiPJ083T0RlQ3+\nNLmDJdw2qpbpmY3k6R0u9MuKmNE0Oxkip1GpN5IAuD0zoau/LzfSybx8qoyJ\n1bZZ0XitAJxjjXLaLE+Whe35x7cZr4DZKc9Tepr0My1/uC9cv0s1AYLlWjRa\nOwwmAoDhmvNQo8VPl2tB4fBtcsJ5QK0KIuVwZGZkpGx1jnI71nx40kGUoG+W\nTildEl3iTUi6fw4F6cxx2yyC3v0QgpBZKOfRYfL2cI8gcu+Ob7lN5V2G32fG\nOLVu1I6koMjm7Ww/kKmfAGXX+E9jn9XfPdFDT7jW7vknQ5QU+Uo96oLizebC\n7x4ARyvS5MhE0a82cV3QawoMubim0wC2J97UYfZ8aXrCKaNb+gYzxddi4CAA\n9jjD\r\n=leXi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFxUR120sdgTKT9jjMVitb6GXPfYKOMzXX6kcWWzB6o2AiEAwXd0quoVnD59XrcOUdf7Y24PEca1CuXJuIm3F9naoew="}]},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.1.2_1591041487707_0.2832114551705227"},"_hasShrinkwrap":false},"0.2.4":{"name":"wechaty-redux","version":"0.2.4","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/index.js","typings":"dist/src/index.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"typesafe-actions":"^5.1.0","redux":"^4.0.5","redux-observable":"^1.2.0","rxjs":"^6.5.5"},"peerDependencies":{"wechaty":"^0.39.40"},"devDependencies":{"@chatie/eslint-config":"^0.8.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.10.1","ducks":"^0.6.1","pkg-jq":"^0.2.4","shx":"^0.3.2","tstest":"^0.4.10","utility-types":"^3.10.0","wechaty":"^0.40.1"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"279c98de05a07918f324622e369e435f3759471f","_id":"wechaty-redux@0.2.4","_nodeVersion":"12.16.3","_npmVersion":"6.14.4","dist":{"integrity":"sha512-RuNU1KQez0RmFUqTa50w8dsZHisdCHduLUnrjrP0kuhf2YsAkqkZmQBUHfrtybQaHv/wVdbscwQ4InJfYYvw8Q==","shasum":"a21534bda0478f8d3af5c4456ec1ddf828e1ff6a","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.2.4.tgz","fileCount":94,"unpackedSize":464249,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe1WR7CRA9TVsSAnZWagAANl8P/RMA9V48Shs4aLgI3/kX\n+81pZ2SaD6C6EVIy+EI8g8K0+IhV0xKN6JitpyzTWzYjHOAoJuYU6EYNqYsm\nTwhFzFi6k8jURnUXlzaIrUfNdGFQot4vwUYuhfBDvq/eH41efaQuqrNv8AA8\nHw1KMEJHlmreWkbuptSM6i7EUGBMYH0d6n0MEeBReNP3PvOcyngHS1KYa8PT\n0F3vueU5dgd1m+aQ0i3mibxp/YJx9KfglAbweMV68HcXVcha9FMO9VbleRc+\ntG48Cl0Cy7xZ0pygkAFZL6bYO0YofHKBumiWQFNCmXa6JI6N74iTn85hhhNR\nv9kKX2LK3V4rPzQmptGzTqCgxv8lfIjZs8rZhAhSiQhEkEt1NnRsLLpGYFtm\nKbR2KO6Woy2HY6DjV6wYj0fqNwOB6OC1WZ2ZQ4P1SbXWuwx7etdYIKbBPPyM\nlVqJckjN+U1WQLn8HwxnF65h594+kwUKwM9Pyirr0L/Eq9/y1GbdXPjz3Ro7\nbm984J1bq/aOgBc9h0g1SWKczVCrpZoo4IsEjos6YEx0VFlMhev6b+nmcORQ\nXb4ExS6QGAJ6B3ShmK+RX0hpmRcx9YsIxWCf44PoIhgBQ9oe1+oIqk51HxwH\nGDKBJsu1Ypc6B4qdBBRRMVAPpmDY2OkKOmWpQMqNQ04It3B5yxgQA1rGFM/X\nXrag\r\n=O8hq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAmbLlr6L8kA61skfzGLlb6EXwhg4ucBkyt1V0prj8RpAiAs8A0qiDzfFjlxMc/OCKt7w9Fiylpf8fNGBMsCJBmGOA=="}]},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.2.4_1591043194571_0.18555109177076545"},"_hasShrinkwrap":false},"0.2.5":{"name":"wechaty-redux","version":"0.2.5","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/index.js","typings":"dist/src/index.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"typesafe-actions":"^5.1.0","redux":"^4.0.5","redux-observable":"^1.2.0","rxjs":"^6.5.5"},"peerDependencies":{"wechaty":"^0.39.40"},"devDependencies":{"@chatie/eslint-config":"^0.8.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.10.1","ducks":"^0.6.1","pkg-jq":"^0.2.4","shx":"^0.3.2","tstest":"^0.4.10","utility-types":"^3.10.0","wechaty":"^0.40.1"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"481720bdbe38b152b541f55b6fbd65bcb25e660b","_id":"wechaty-redux@0.2.5","_nodeVersion":"12.16.3","_npmVersion":"6.14.4","dist":{"integrity":"sha512-Xelac+0rxYEiG2mZ8KieXGb404+rckhdW3R13YrK7QSb1XVPZTCXvwC9GXaW6kIZnX6r1wn0WVh+YoHR7ySZbA==","shasum":"8fb44ed3af76a368eb7f27519449e856f8a31f04","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.2.5.tgz","fileCount":94,"unpackedSize":464292,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe1WSpCRA9TVsSAnZWagAAelcP/iX7QkYM+5+2I/l/eERn\n/lPnUsJlNqM6MUSoJPyCVpuKAAnvt0B/zQ5U/O9XC9otV3Aa8ZjQo3fqg7eM\nl3eNkQ8SB4W9UChy70Q/QYKnTeAdXGr7A1QUG5Ld3wmiYCOXgz/vwzj0PQWA\ne7AgIJ/7iyJ9VflmWMteeG/OnjGPue6E4vtTOUnn+BuFckflUwWM8Hgp1Ojp\ns49RtbILRDRiCSx4MLLHEnNzYXKH1K0B06tjVPRT+aNG6n9387bKYtSbtyT9\nBEgCUieo4+fX8Ud/o7Fb5HaKDXewNK7p48OJ8lXM/JJT2dmz6IltEvtSrhCS\nArt3atW53b9uESt6LpG8+So2nvEMXARq37LL2eY9NM7IppzldZyoMpdqsym3\nap1A94bBjFljsIgQQcMsSiBK887NUnvyATEsqlU/auVDnXBfChpTqQpJM1BN\nFg7z2m1FszPc/LQpFAhgJqGk3FFpnoOUNIWe0u1OT5MhfGxUPS5bNIBKFvXV\nYL3EUnDyqFmZeWts3tt+3mHyZQKK2ClAVMAntdUUBD/KHtEwAAp8gIeAhZLT\njA+UH7+75/jS9T5px7L2nFnadv6vMyrPZXNDY3PppiNh/FAKd2MRigMwgf5M\n3anwC6x7p21B7gUVJ2wn8OiNlj3kKN6rAAP0SHDAOty3C6FxePn+wVlbVXc7\nOoht\r\n=reCl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFBvLEOpAdo9z7U4THwwoj+SJYE9+yIQqIIvTqtNRhUaAiBgkvdBTY+8HcOsFzBvoykTJo8pNH3dPbtEEw3pbYlWsA=="}]},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.2.5_1591043240458_0.19650510741593363"},"_hasShrinkwrap":false},"0.2.7":{"name":"wechaty-redux","version":"0.2.7","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/index.js","typings":"dist/src/index.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"typesafe-actions":"^5.1.0","redux":"^4.0.5","redux-observable":"^1.2.0","rxjs":"^6.5.5"},"peerDependencies":{"wechaty":"^0.39.40"},"devDependencies":{"@chatie/eslint-config":"^0.8.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.10.1","ducks":"^0.6.1","pkg-jq":"^0.2.4","shx":"^0.3.2","tstest":"^0.4.10","utility-types":"^3.10.0","wechaty":"^0.40.1"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"e46ced8774d9ba76ab6f83d7ce0e01120ce1d908","_id":"wechaty-redux@0.2.7","_nodeVersion":"12.16.3","_npmVersion":"6.14.4","dist":{"integrity":"sha512-7eD2zLJjfBDvk/M8gwBrrujg2hZWbCfsTFqbWi35nP/yVjsrmvtXBmg3OGcCPzKJ7g4oNRe8EOuEBCJeikPXug==","shasum":"3dd04cf516a413ddfb865ca3ff7e3fffbc72a202","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.2.7.tgz","fileCount":94,"unpackedSize":464622,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe1ejtCRA9TVsSAnZWagAARbkQAJPv0WQpz4Mf/zTqu6yN\n94u07KfGrG7yD7w8hm/kf6tfel651N19LJHaqr6Yq8emAppNtxnfiaKZbJuj\nws5FQ2WlFE+arQQ0LViTPXfKeceAHGF+XTPbBkuK9lgajauW1o0AzbA26v07\nY5weY2w9QmCEhFH4iuA5D4XH+r5JNZAMEwOhKN+mtEdC+lLdaxcTuDYPAayJ\n6xrBvr+eVA+eqC1r9GX7NQuyeke7mB4COnGXEyRCErUHuSp0SuEfuGPYGBAL\nSgWYiygjmC7jImN99bmCamDOLUSSlXR24Vu+nP7ZN5t/IS+Ewsg9K8juR5oX\n+j+NxtHQT7vaSQU7WMUtcgeIiG6UotKQB+i907nf4U10V0HfMOlfjmyhOLEq\nEZdUAI/D2GfUsRlnTcxODTHJ3oS/eNESTtYChn+zbdDEOBITlk+dyeIYtzQ3\nkimMZKXG7FB7xspauYalSs+tuPPBQXyMS0qeyiabxXqlJ9zJktljv+EUBNG8\nT+K7+NiQ2CN88yCEbHE1cJpBz//c8nLhrRkjS1TLLtsGxcPqWze0Ey9jK/wr\ns9Nf0OwyQI4Pt2Myy26Ty26D9dRKLvEDmLsLnUGbjyuM7bTmcXAN3kvHno/x\noa0Pgin9Ou+MIB1Sk10LJdGvD/MmbHSf5uO2LMgx4iNxjy+O+Cfa1Z3gzX0w\n+/UW\r\n=8xf0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD5JIs1PFZpJKff28xZ6bCoxGHyp5N0CuphGyLb9VfCugIgI8O8P3vyl7Esqf2/63sI0CG7UPBySZ68IhiWx5GUB6E="}]},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.2.7_1591077101005_0.09961588710482494"},"_hasShrinkwrap":false},"0.2.11":{"name":"wechaty-redux","version":"0.2.11","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/index.js","typings":"dist/src/index.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"typesafe-actions":"^5.1.0","redux":"^4.0.5","redux-observable":"^1.2.0","rxjs":"^6.5.5"},"peerDependencies":{"wechaty":"^0.39.40"},"devDependencies":{"@chatie/eslint-config":"^0.8.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.10.1","@types/remote-redux-devtools":"^0.5.4","ducks":"^0.6.1","pkg-jq":"^0.2.4","redux-devtools-cli":"0.0.1-1","remote-redux-devtools":"^0.5.16","shx":"^0.3.2","tstest":"^0.4.10","utility-types":"^3.10.0","wechaty":"^0.40.1","wechaty-puppet-mock":"^0.22.6"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"9a1f261a3f10bd919c679d3a9809a9e77acdbf7f","_id":"wechaty-redux@0.2.11","_nodeVersion":"12.16.3","_npmVersion":"6.14.4","dist":{"integrity":"sha512-EX4srbp3JXB0txOYM2xU6SHzu7AsS6RcONpuIEkKSh4e2n+RNIH6Fx65uZtdYq0bcboKp5UWkQCqgfKRR0lCzg==","shasum":"4f70143a49e44d9239b1d84daab337ac1849c174","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.2.11.tgz","fileCount":109,"unpackedSize":491548,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe2dOOCRA9TVsSAnZWagAAJTAP+wZHfDdu89degSkdYi3b\nUI1fZe62En7pHH8ZIH6XW2/67MTJTQj31xxK9lAih9AKh/Tmil0r72MIwNoY\nJac6y/Hwk4KAyS6Dpku4450BgI+6Jxw9tuPuLQBsX/GTD8G7oi6x+T+A1DBD\nRPmwNc7JQGjXOqgJMyUGNCa39QJ53jdx6eIi2mbqz+tRd7HP4S8HTPeUyRhX\nPhAIw8lCv3OZn50IfabXzp/iz765Zr63GPp5oXbAqjEDlwot/kfX4gBZDTIN\nEmyVzmMdGE1Ea7Gd4Z3SDjP+ZR//jghMVk/BfaTBY7i0f5p2Av4LV55wLGG4\nxTjkXiyaRQH1sR338SeRL94fbWqPl3KraZLXdIx7QXMV4UsbgU80BAQHBvWr\nZa7R4fVj2lqFfA/hc8j5KwcHOry6EKwvmeLe5vpqfgks/ehH05D/OUOX/oJV\nh7vTou9QmY7v8rZB1nhMzKDAHlDykcOpDyuIKefG/gz+gxqaPO01+yiQFsQt\npUtk89Zd3BdrFAXps8eM8UW3FMjH7LzgijSbEScpkcHgniGsrfslQGpEVTYJ\ntHHLryGO5e6GQZdg+/H1s3mo1tzHGtYLxC0A2r7Mj2BJYcnDVHqjNDyy5+jT\nYVyYgTj7C0yoEXvfYzspZWeNId1YmgeLN373IkUbbSB9dZ61A3uYisi2Vh/h\nyUec\r\n=fEIy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD4aUSPAf80DlxcRcVj3fQbEvRS8jb5Dl5G9Qeu1XlPVQIhAP2oekuJVh3uiw1glFRnDTC9rCI/oWYuyu7JEddOTVoL"}]},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.2.11_1591333773885_0.21799233972868448"},"_hasShrinkwrap":false},"0.2.12":{"name":"wechaty-redux","version":"0.2.12","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/index.js","typings":"dist/src/index.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"typesafe-actions":"^5.1.0","redux":"^4.0.5","redux-observable":"^1.2.0","rxjs":"^6.5.5"},"peerDependencies":{"wechaty":"^0.39.40"},"devDependencies":{"@chatie/eslint-config":"^0.8.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.10.1","@types/remote-redux-devtools":"^0.5.4","ducks":"^0.6.1","pkg-jq":"^0.2.4","redux-devtools-cli":"0.0.1-1","remote-redux-devtools":"^0.5.16","shx":"^0.3.2","tstest":"^0.4.10","utility-types":"^3.10.0","wechaty":"^0.40.1","wechaty-puppet-mock":"^0.22.6"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"0949803051eb5af949ad8c93cb934cd8c72075e2","_id":"wechaty-redux@0.2.12","_nodeVersion":"12.16.3","_npmVersion":"6.14.4","dist":{"integrity":"sha512-T4v+LcOdXqd1yXKRcaXWrWnIa4IjjpDdmciVmL/T9EFxURwr1A7VM5YSgN7b7FLhziuKBI7S/9QGOkaIGcmqyg==","shasum":"88dce2e3300a85cdc57eb8c781b15ccb0a53face","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.2.12.tgz","fileCount":109,"unpackedSize":491490,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe2dS3CRA9TVsSAnZWagAAJssP/0FuIrPK+72nUy+zh2rE\nWQWi0rNL0OHA40bgPIVahmRQFPeNE/v5V/K32YoY6Hb7tnLsZLolUrv2jCZ+\nkOXKg6ei112XI8Mi/yliWs+rzu+P9E/EVnYEgzwjLJgLWPmLU9tlaVvyQkpE\nwGEtcmjCLChnMfNyOfUYstFj3BbokZ5E7i26V4u2kGyA+ZvkebMqONWsaheV\nApQJFE2wNf8ym9GL+9wLw6l2DNALv4iVJ2Nu8QLjFyjQ/GkHwY3VEKFTOXsf\nDcF2d4Mq6EUN8uUeZuJakKCwpMACq8Fp1mT/wTKRB7ugvp/+6XUh5WoE9C85\n1VORydoeI1Yx4abgmnTCn+RaczmoruLBYWIRNa07KnkCB8qf9k3/6C3LwOCC\ndspxq0zabEAUAKvgKAN1cbknpF/8VWD29GdmAYYSEyHUQ/0wyJ9VeMI52Krz\nDo+A1R0BdBl8SA1tQj7iRSFmoc+EDT1TlqAZ4BU6kce5g2aSKYZt1BHqQGXR\nh0knuggQaYWckxwCdDjzLovwwQpQ85gLcReL23Yh0dGZAkOsgX5/IYx1OoM0\nkuA5ERSZYmYAccpUVpOgrh6ATCMacmN0qDKMGDOcfFEoj/d1DOmPbAawjdbC\npZX546WhbTRDDhEbGlgQYOnGMMEQrZLZppTmYmx+CzAT+bFJPWLfQNn4wKv7\nPb9B\r\n=smWT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC7ATaE0SSAaILOZ/SNzW0KfCxB17xqEiYLDFmY7PCq0AIgOVDzi/Vxr2xYesiH79b4PjvfB2x5fBxuaXmspBqNjT8="}]},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.2.12_1591334070346_0.394234529870781"},"_hasShrinkwrap":false},"0.2.13":{"name":"wechaty-redux","version":"0.2.13","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/index.js","typings":"dist/src/index.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"typesafe-actions":"^5.1.0","redux":"^4.0.5","redux-observable":"^1.2.0","rxjs":"^6.5.5"},"peerDependencies":{"wechaty":"^0.40.4"},"devDependencies":{"@chatie/eslint-config":"^0.8.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.10.1","@types/remote-redux-devtools":"^0.5.4","ducks":"^0.6.1","pkg-jq":"^0.2.4","redux-devtools-cli":"0.0.1-1","remote-redux-devtools":"^0.5.16","shx":"^0.3.2","tstest":"^0.4.10","utility-types":"^3.10.0","wechaty":"^0.40.4","wechaty-puppet-mock":"^0.22.6"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"bfc8d951ea82f1fdbee1d00bec8a0af1808ed1c7","_id":"wechaty-redux@0.2.13","_nodeVersion":"12.16.3","_npmVersion":"6.14.4","dist":{"integrity":"sha512-VR1KsXgh+aZuPnBBbXU9KTzmFCGuAmF0z8KTifp0BXbfclMnDjrcQCuSWP4kiskt8BXYq9uHHAkzHrcZ0+dI0g==","shasum":"b001f0a5bd77e266b135a95f60e56e02eca07dad","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.2.13.tgz","fileCount":109,"unpackedSize":491489,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe2dpOCRA9TVsSAnZWagAAo58P/2HasLOim4x8zLmxKrSv\nbLnvnMFfUrOlM9Uc/DonFbNV0N1UgdrlR8fAmQE+e6+8JHLwlkYpBfFpxdLn\neeTfEOS/TMxB8yqXNeJpLCytCIBlR0h/od9YmSBeBIk3b6GcD/Z/OXDg+oWh\nA7/c0i0CEUbqM9va2vPNjrA7Mgh2gyf/nu+HwAwLAuaiuFLj3G1hGSsFSkgK\n+RUWekWgqcPepHbyRGXTSs2OnWy1t0AVTFFoBvvmNbhf3U1mRE1k+HfuLMar\n22jDhX3n3ixwXlK0A76BmRJIg7b4dnJOsJsn96P55Oe57uHNkjMKWJC4Vo8o\n5VzvdkZfrjhH+FkrGMHV+ISBB9UTA7F9t9DbIbQ7hvEKHDBYAUzC6gVP1g67\n5BeKg7GmcRD8AQnK3oJ8o6QN7zOKXme7GRiFjxO0t0kEj/rUBIXvmxl5+dam\n2ji8U83yFc9PmRSGoXxCMU/rmhmsVCgCyRoauRGuAzW2q6DVoipjzPfr9FWA\nDjPLYKJImnlPQ//q5j1Nnl2qX9DuBeq829Yn8CJolTM8DDscF6s0i3JSBPGT\nTrytjcqsA+4XO8H5LmFVgR/qb53rW1hymBQFJTHGQ5SYNrrwbuOuexJbmNtm\nz/Zt4MDv4j688ngzzoJgiEemGJmRj5vSCwfdVzby907Ina4vuifOmqjSL8SA\ntcnO\r\n=K6Zi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCJgRPMV7lax8Gqw6ePwufbNhTjOaIECmS8c4yvcpLlbAIgZZnnggt0ixytAMATJh9jCWAxFYtlAGkVHqxvflg8S1o="}]},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.2.13_1591335502374_0.5446984798670838"},"_hasShrinkwrap":false},"0.2.14":{"name":"wechaty-redux","version":"0.2.14","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/index.js","typings":"dist/src/index.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"typesafe-actions":"^5.1.0","redux":"^4.0.5","redux-observable":"^1.2.0","rxjs":"^6.5.5"},"peerDependencies":{"wechaty":"^0.40.4"},"devDependencies":{"@chatie/eslint-config":"^0.8.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.10.1","@types/remote-redux-devtools":"^0.5.4","ducks":"^0.6.1","pkg-jq":"^0.2.4","redux-devtools-cli":"0.0.1-1","remote-redux-devtools":"^0.5.16","shx":"^0.3.2","tstest":"^0.4.10","utility-types":"^3.10.0","wechaty":"^0.40.4","wechaty-puppet-mock":"^0.22.6"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"01f85ad231fc0a21a54c3e73d21e227a4a1bf43b","_id":"wechaty-redux@0.2.14","_nodeVersion":"12.16.3","_npmVersion":"6.14.4","dist":{"integrity":"sha512-1ZWcVPMnO+t3C77QilQ8jhzr8A/v/H1/pTYQ6t0NwwRK3PM5SbB6RDNrEgzQXQLu2gSbXHN5z138yv1aRISS0w==","shasum":"3740b4036a74a8492254e0d3500f085995e6dcae","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.2.14.tgz","fileCount":109,"unpackedSize":491489,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe2drRCRA9TVsSAnZWagAAN4UP/RSaYQmGbmULoDp/XPaR\nCkgYOnWvTk4w4lXE+wqmHLpNUzDeVfZxkYl1ssdHtmbfa/j4XhURksnRFX5v\nF0cF+2m/A3ttBsj5a0b45kETNklcJ2IxO4B4rSiyZjozKo0QYO/3C/cj+4VJ\nqsKgKrRrfjK4g0Tr8lMS3uncOZbU81wH738/gjk9e1lanJVqofpgeTVdf6vh\nASfkkMyCJweogJW8XFwP+Vj7MUjAiSOjC79/KKn+dqEwcGM8QRI9he4QvpM5\nF7SnSUtiohZ1YxaxRa+Ug7c1SdSTEnZmhgiZHPh2dNieTbckTAAkV7sj+omp\n5MaQ4z9b1t0j4jQq5477fPiFgfvaB30VSdKCFO3Q9RESK/XkJNss4RMnmWzE\nvT/ep0kqyGV2jVABufuZMC9n9NZiQy+jqsER8z71fBRcCOGe0j5jW5X+xVKg\nMuGTHU8NZfS2YZQ03E95r3kdeByRGNdD+/fTn1tOExWPmmZsFdm4G5xXudIg\nzl5DbnmbnDbVxwVeG+IBBUSrqaXwiuRTQ5to+FMQb96E4IiULrCCzpIQzwjN\n1FFO9yht1Kj/XI9h6stnNrk76Fn4D1lvxocd+MXmpsx2+hjINQgn1Lt48rLG\nmAtjYqChAa51e7+dCGpQqpVrM0VTtBFFjXGxSnPgdZWpEv4TyTUTG6xQ55+M\nAKNr\r\n=bU7Q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHFjvXyHdXfq92nXwkM3ym2jI2OCxWWJzwzX1Xo8AwUnAiBYPGugtz/n/U3BvYUlVvD0FI7NWINj/Rd0ykVVbbGA7w=="}]},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.2.14_1591335633118_0.2227642387900679"},"_hasShrinkwrap":false},"0.2.15":{"name":"wechaty-redux","version":"0.2.15","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/index.js","typings":"dist/src/index.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"typesafe-actions":"^5.1.0","redux":"^4.0.5","redux-observable":"^1.2.0","rxjs":"^6.5.5"},"peerDependencies":{"wechaty":"^0.40.4"},"devDependencies":{"@chatie/eslint-config":"^0.8.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.10.1","@types/glob":"^7.1.2","@types/remote-redux-devtools":"^0.5.4","ducks":"^0.6.1","glob":"^7.1.6","pkg-jq":"^0.2.4","redux-devtools-cli":"0.0.1-1","remote-redux-devtools":"^0.5.16","shx":"^0.3.2","tstest":"^0.4.10","utility-types":"^3.10.0","wechaty":"^0.40.4","wechaty-puppet-mock":"^0.22.6"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"38930494a0c102cb3f1ea3ed839e904b47916188","_id":"wechaty-redux@0.2.15","_nodeVersion":"12.16.3","_npmVersion":"6.14.4","dist":{"integrity":"sha512-u+8WuFAXL6rZyLUX+F7GZ5pX2qT9HkKHeeZLA0sO9O0jpIhwEH7ZCBHSZBcbs0E8iCXx77HRF4TIowvjDQzRsg==","shasum":"19c0dc7fc29b9d7a9377907e08ad00c7c7fa09b3","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.2.15.tgz","fileCount":114,"unpackedSize":540006,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe2d0iCRA9TVsSAnZWagAA5XcP/iGimm+foaqMtbTCZ7US\npBYgwYMtpL4Xn/JP/yp8yaE8W7DcNYoLJsqnOFdiYTEnLwe3LWAmxzVz8Ich\nVJ48XXm7NSNY/hjaDKdKz0xLMWIoXPiMJdLP6G0UHNdwMLeJ4VfdHbGk7BbT\n+O2SMQtwviT4Kd25OBbKDCMYRUsu0XhGKZcLdnyP9GkXtCM7llkXaTmr1xSg\netfX9mGFr1mubIJnGUEjYgshesA3BxEOTozRDzEHkfExrK4VbryICRHmv4AA\nFDL07yZyBPd0R0G/bCb6UzLkxVWRCn1+BBk6MPJEV6dvzueeeaLW9z5LkhDc\nXRHF2YoXUkJo2r+TENx2QVcmM1MvFAMalw9eHeKC7BsBnF4/4bByFThncK0H\nYmBJYNQw6iR3JXUr7xnuLYwZSaEH3VN/A3VnyElJ9USnzve+KEttTS5lxd8S\ngQAGWCeCDpY4Z4h+ogsVdQDfpTfhWWQDLfoU2rqmGF9MZqL+Nlqy3eYS37eg\npW4b0iPuzKYLXNSYvbAaGUCGGECNK0DqCrnI2Iz1LDdtdlkqa9pZ42GtVGKe\nwc2A8HdaLLZP18cqnZOYwxWb+KFmJ+q6bM5rZIoJXEmYQN8RsqD4COF+0gt9\nmQL7d8+Gwpa5JQ+8hkL9erJJTHDaKeRfXcY0hgxVBm+it12ckOLyyx5rQydN\nwqtS\r\n=ozSR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEQJQ7J8DLxyk6tm6p8FuKX74jjycqhM5tU/bt2Oi+ljAiEA4sWBpnBlWSAHO7HNMBC37/21wKKp8YQLqzcJR/rAulo="}]},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.2.15_1591336226173_0.3973917571097185"},"_hasShrinkwrap":false},"0.2.17":{"name":"wechaty-redux","version":"0.2.17","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/index.js","typings":"dist/src/index.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"typesafe-actions":"^5.1.0","redux":"^4.0.5","redux-observable":"^1.2.0","rxjs":"^6.5.5"},"peerDependencies":{"wechaty":"^0.40.4"},"devDependencies":{"@chatie/eslint-config":"^0.8.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.10.1","@types/glob":"^7.1.2","@types/remote-redux-devtools":"^0.5.4","ducks":"^0.7.5","glob":"^7.1.6","pkg-jq":"^0.2.4","redux-devtools-cli":"0.0.1-1","remote-redux-devtools":"^0.5.16","shx":"^0.3.2","tstest":"^0.4.10","utility-types":"^3.10.0","wechaty":"^0.40.4","wechaty-puppet-mock":"^0.22.6"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"5b631b40295062c3091c5884855f8b9a1d113448","_id":"wechaty-redux@0.2.17","_nodeVersion":"12.16.3","_npmVersion":"6.14.4","dist":{"integrity":"sha512-wgJMuN/2s2PQMft+2eDVrrGpRiPq1PNbQj+ncPIlhbRszwwoRDQ5vsZFrliSyIvhJA4wKD8AF60ckKkJrV716Q==","shasum":"e87c0d3cdbf6581ee2cd8d7ba53a15f778d62339","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.2.17.tgz","fileCount":114,"unpackedSize":540466,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe2lPPCRA9TVsSAnZWagAAemcP/RX9oOpQPO8fpvutIacz\nz/WjoH5hZ/XpBSSJMeF9o1DxFRbG+y9S0D0MzfBvS3HTPUe/HyROB3IGhshg\nIn+F+pfmISksHolD+XNMXEae4riStkbUA2qrMH7qcBLEzMVykEhRvKi7b6NO\n+RgyzgJP9399ZYfySTBfdZZ0HX3BjnZNotfKjqhm0AELcnOimO38coVGX9tq\nLWGN4NS55qKaI26LecKJC9UF3+nCrrouM/u0swdEL85zwwovP1T7FPd2avF2\nS+kBnHHZ9aP+X8qjwTgoIkXjVpenVIZTAssHNF8CJ56vrflW1DYdlUXym99V\nyf4G/FrFnMiuHjVBBDHqTLLRR1RFPUQ1sjHh5TaJq98yQdCS7P9zyYb22c0P\nm2vYSa6fqbPA/QehwUD1lCBGQBdyF8qEwqrWUItdxLgldPq38kPZ3ESkvVPO\n83wf73+sRRiJiDZN1JbixKpjTNkBKpSCcAgqdK2dewbnH1Vp+Osm2uHw4E7t\nvmYOfjyxVmFeQQWaDqZ/O9Kuugmwu09Vat++wz1VssnBtuaZ89+Imh8D5Xeq\n2sMNmhCDuUXgwgQ1mFEYTZ1CzNuCgd1Ns5vTTFO8Vo+eZedHHcMegyNmD2S7\na6W+1+JVAVLXgssPUntgcVoaXjj74gbaZwUlK5S0Jn3sid72ro6oQlfbTZbb\n7KgM\r\n=HorV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAbQC8ba9acFYALi6ZcmWi2+Tw7HrElJK3IuMHXtKOltAiB41nKlTWPlNDzFigVmMz55p0c8yJavKU2p6buBrqRtng=="}]},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.2.17_1591366605360_0.27336836464559955"},"_hasShrinkwrap":false},"0.2.18":{"name":"wechaty-redux","version":"0.2.18","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/index.js","typings":"dist/src/index.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"typesafe-actions":"^5.1.0","redux":"^4.0.5","redux-observable":"^1.2.0","rxjs":"^6.5.5"},"peerDependencies":{"wechaty":"^0.40.4"},"devDependencies":{"@chatie/eslint-config":"^0.8.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.10.1","@types/glob":"^7.1.2","@types/remote-redux-devtools":"^0.5.4","ducks":"^0.7.5","glob":"^7.1.6","pkg-jq":"^0.2.4","redux-devtools-cli":"0.0.1-1","remote-redux-devtools":"^0.5.16","shx":"^0.3.2","tstest":"^0.4.10","utility-types":"^3.10.0","wechaty":"^0.40.4","wechaty-puppet-mock":"^0.22.6"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"1f23ba7e3a52461cd6f661fba30e29d610d61609","_id":"wechaty-redux@0.2.18","_nodeVersion":"12.16.3","_npmVersion":"6.14.4","dist":{"integrity":"sha512-OiUOJsyIE+L83xhUEQED9YCoAEKn4m+/4rpI6PJDMENKUGxqj64PDnTU0pNEb3ZuA36YQbFupY+BQJrOAxd5iw==","shasum":"a905943fdb5c73e535b75a102474028db6e8306d","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.2.18.tgz","fileCount":114,"unpackedSize":540385,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe29IXCRA9TVsSAnZWagAAx6QP/2bX7dDgQZm7xUGY4V/E\n/KyWYGkQO1jBxQpQ928RNfr7Tj0f4uSO+/ChWT46PTdQgtKn0slPakaonybA\n35H28sB64MfeVgAzIjrYruYbtIsHsQnbKm6dX0jdwByvGbLizYZZAvvoSHGW\nI8aovGH0G8dwTpdHYQuMCYAuWwgTFdOONlPg8M8ut9VH+IEnRDIBZ5xrCiHd\nw9+Fq51sktufb3txZfAUa2VdHnBO0mDbOl2Y4D3AjPyauTQR87/E6VdaxsNr\nSlduyRRr0O+XhyqGK/zQxEYdWStB87CWz+ROpTa2kqQxCDED13rDz9ddO7Pw\nZsR2KZ7IWplRMGixM9VuIUOclOV4Nwd0PJjgL5s7z2RSUnFSL0lyMC6yMmF/\nf+t1rDmpbxJc7SBt1oNfJVhMLAaU8GCMKxcmFLXiVo3ikmyUNImIX8w/L56l\nykuUfsQ6jYvo3cmDHS6mzzQR4o6XFCGcZ/X6FtESUTm7nGN6ABlin2kxQ2DU\nHaGFyCRxq39UXOW8OXdxcHfNK0lMZJXHVVwZv7ief+lgCn0KpSdUtIm/E0Lo\nBXtj0TXjS7NFhEcstkighT/pjZ77tYwsk51IZkAJ1SkoaujdKd29suzNYF9X\nVu4gEnuDAh2bF+bGl4Zjc5+2GhnvZp3k3EYR0YSWhGfp9CNnVkWLVPsP13wC\n/lqC\r\n=TDet\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE8PxcCdxZ2ry2fs+Q/cWJB2COi3Cvz3K91CG6LNGlu7AiB6oCRuygfRdRqRV5/occKsXibtqKhPUD2pZp217hFDCA=="}]},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.2.18_1591464471376_0.27524844226958045"},"_hasShrinkwrap":false},"0.2.20":{"name":"wechaty-redux","version":"0.2.20","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/mod.js","typings":"dist/src/mod.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"typesafe-actions":"^5.1.0","redux":"^4.0.5","redux-observable":"^1.2.0","rxjs":"^6.5.5"},"peerDependencies":{"wechaty":"^0.40.4"},"devDependencies":{"@chatie/eslint-config":"^0.8.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.10.1","@types/glob":"^7.1.2","@types/remote-redux-devtools":"^0.5.4","ducks":"^0.10.2","glob":"^7.1.6","pkg-jq":"^0.2.4","redux-devtools-cli":"0.0.1-1","remote-redux-devtools":"^0.5.16","shx":"^0.3.2","tstest":"^0.4.10","utility-types":"^3.10.0","wechaty":"^0.40.4","wechaty-puppet-mock":"^0.22.6"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"d462959b4671be50d3cff6659864133ec7c399d9","_id":"wechaty-redux@0.2.20","_nodeVersion":"12.18.2","_npmVersion":"6.14.5","dist":{"integrity":"sha512-y4SJqrN5xcWXcZ9FHsLE/PQZSdJYkQ4OQq18xuJABuFz5PnkXztdCIW4ICk0rKoGK4fyxBC+FgOdXoQ3MqZ1wg==","shasum":"55913d1f10112c0004e61a8bc3eef5e66145f42b","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.2.20.tgz","fileCount":114,"unpackedSize":540421,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfDzn1CRA9TVsSAnZWagAAtHQP/0QUIXJSsixoT9fxdcwh\nFetfrhb1bd6tRTDd2gU1ix+foiBR7k671IteukH7kAo0uZ/1xPI4x6DzqLkd\n727nX1fXgfK0YeZe+DSo8myD5p0xWjO6YygPrkyOK7Oy2zSWDbQl5ffM1S5O\nrdxAcP6jdKdY+1a0LZvXMXmZLoTA2IoUmBV9P49zwXuDZ89MRYQQnjVcY1yg\njNRiU6270YZ8WveRcwib5MfisMQLDl3ZqIA9mc6Bn8zhnymS2uA5psJY5AYd\n1VMUu/yKoB+mPRSIXxlkzCkfI5Zv0OJmP0Wb+qve8WOFulCltXd5/j7ObltK\nyY+vPEsHm7Vl2/1OUpOR1m11BaskQ/Ft970kW3TueXjt0PsvzPWLo4XAftzV\nYe1es7KdVngj51HqZjwx+CZArSfxNArUctdKNH5q9cJ6mjbJgk8nW0yjGXhu\nLcVryB0JmdNWAGFqLp/2XX6kL+lRvejThDKc5ZrlWf3GIg14N9Q9v3nm4iM/\nDFNLZs/tAU7LyhlK7Dm8NpRTKv78KvSJ9h1VNa2gtFmXrMCqaEX6XWjlmnV0\nENYxwNs9LHLnodoT5IK1rpUSccGFmGcQboyRNl/n8iF1prgXcRY8MTFYTJWX\n77aUb0O510/772NZi2UBAcsVB2TI5O9wxlrsBQ2dM8naKVP7COKSO2gWqMfA\nEVv4\r\n=sI6m\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDZTsqokJ39UdiGbmeo/WL2JoHBcK8sIofKU8y8PgGS5gIhAIyIf4qYxSMFETgKIiMSY39EEVo+2cz6Mjagze5/mPU2"}]},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.2.20_1594833397392_0.3608732802694301"},"_hasShrinkwrap":false},"0.2.25":{"name":"wechaty-redux","version":"0.2.25","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/mod.js","typings":"dist/src/mod.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"redux":"^4.0.5","redux-observable":"^2.0.0-alpha.0","rxjs":"^6.6","typesafe-actions":"^5.1.0"},"peerDependencies":{"wechaty":">=0.56"},"devDependencies":{"@chatie/eslint-config":"^0.12.3","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.14.1","@types/glob":"^7.1.3","@types/remote-redux-devtools":"^0.5.4","ducks":"^0.10.2","glob":"^7.1.6","pkg-jq":"^0.2.11","remote-redux-devtools":"^0.5.16","shx":"^0.3.3","tstest":"^0.4.10","utility-types":"^3.10.0","wechaty":"^0.57","wechaty-puppet-mock":"^0.28.3"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"bc4acd28a5e5f5759565b3776170237ec77252de","_id":"wechaty-redux@0.2.25","_nodeVersion":"12.21.0","_npmVersion":"6.14.11","dist":{"integrity":"sha512-gSH6p26h7ziGOk7U7KlLDufkKUTuGVBUk5MccGN/jYiMNKu47taeKgT2bMn0PnhtBD3pxnjYuy0H3xoxNuMndw==","shasum":"3b6b65885a85b6f78017726b0c7a850eca9eb779","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.2.25.tgz","fileCount":114,"unpackedSize":533649,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgS2Q7CRA9TVsSAnZWagAAZrsP/01nCUzAn19pcr/7Rkez\n1YqJzaJD5KLIThxQhFVGYQySJmPzcjrcgBPhqCTIzZoHthXGTq1X8eOMEROj\npNJmyzxA2+oRwfoZhL/SBEMP7J3ULTJSj9HqlTil3wd9Q4Zq/SHlrJWAEgZ3\npxm3inYUGkjjKeyR43X1Hlw4QxAbFg5Ibaql0uZNeG0T9tE1OSL91GUS5PFa\nWR1GT/O9h64gwOmxUZ2UwzqrUd4I009iQGshAcMzCGQWXpwTCTkB+P50H+T/\nT6A6/T3HpYe8i9353pd+obineFohyt5yOXhxfGnaQ6bGSRNektoQie2Lm+aN\nZ/+8+pQsYVyqg+x0/h109REsA48rZ3ld2bxKNUh4U2IjaJyEJZ7R5+yXRq3Z\nCLpWxMtpr+d4fW8NZvNIhEdZC3F9gFOGGlw+BOgwE2mV01nEO+bzq3AtEzAc\nDI/xdguExHSajoeGjhxLep7LEWO6pP74tn3AzXKEm9yBar54wcvKBhDPsTz6\nfT41TA0kBYCboTojIj/r2pzKwt5ZgyAsz7FvelMgt6kvkwbdbCkjrwWKXDxV\nIkJHu4PIUrYmBIjM2nDH0AXUPGh81p49KIfPQ/+z8hHp8X9Dk1iSkUvlMgKG\nxCgVf6K3cAMp4vOIgOU1Xw4k2PqDa6b9JF8cBORi06rOnwHlB001Qj+uYdDz\nEnYs\r\n=RARc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC0H8GwJAlbBpuao+1jT2lN/vH6kPks6KcxpbW0UajMzQIgS9stqWzDJKKl+ykORuTKQK7Xtshtri1uD384pR/qm2I="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.2.25_1615553594832_0.5199086057205908"},"_hasShrinkwrap":false},"0.2.24":{"name":"wechaty-redux","version":"0.2.24","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/mod.js","typings":"dist/src/mod.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"redux":"^4.0.5","redux-observable":"^2.0.0-alpha.0","rxjs":"^6.6","typesafe-actions":"^5.1.0"},"peerDependencies":{"wechaty":">=0.56"},"devDependencies":{"@chatie/eslint-config":"^0.12.3","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.14.1","@types/glob":"^7.1.3","@types/remote-redux-devtools":"^0.5.4","ducks":"^0.10.2","glob":"^7.1.6","pkg-jq":"^0.2.11","remote-redux-devtools":"^0.5.16","shx":"^0.3.3","tstest":"^0.4.10","utility-types":"^3.10.0","wechaty":"^0.57","wechaty-puppet-mock":"^0.28.3"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"c60ca2b6acd8fdbe226bce5c96fcaf536a466305","_id":"wechaty-redux@0.2.24","_nodeVersion":"12.21.0","_npmVersion":"6.14.11","dist":{"integrity":"sha512-IJOCKPoK48eWA/Ro8XMTQDdFH0Ni1ST7cpvWbtTZFEKqlTesVd0CbLDPDC9gCRjsSLP83Ay1g3r25asm/KW6yw==","shasum":"8c5fb8d1cc78f8f5a1092fe5639f2e0a7f6872af","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.2.24.tgz","fileCount":114,"unpackedSize":533649,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgS3jHCRA9TVsSAnZWagAAWo4P/3xDUEr4PYR6l6VVvsKn\nnY7EWgSfm4UZYgXOPsrZHWPZ9cSeTTdKlQLZSR5mgkmig33LbjKGd5UaXi1D\nrc2h/zmLvaxuODkEJ6wJCpir1/PQeMDGgDPiJIYM+4rIBh5SqFI/GwS8naoA\nRLQVphy1sNHIys8vnyz9W59D6qockrx3mXWHeOb98Aff4k/kVeZM0evqkxrb\n4E5XflAf3ZXjL1NScCgsQp87K8IDHs+RseDwhFg2nnlYoOh/2goOm+e12i3D\nws3AHE5erog6TudVhxwicDMgTAdV1ZvvR2cwkm+KpiyM8NQwCLAz3t548yWN\nF6Jro3V6AVYbTcdvBcNv1VBRb07IS6lEY56JUyhLem4Gn7xAVwtuC8yXPNAB\ngf9oSc7Z8jh6IzsncRxQsW06leQY3Myhiu6+MlbqhNz7atDnuKGrIFk/EO6N\nkqP2J4kMBvuIdb0S6T/CA4mKqDC3cOnpuQZD/+Uvfwkh1PwKdTyXViB0vnAa\nB0jdw0UNU7Uorb96a27hkCExQZszaI/6NC71GqZHx7nPl1xSmMIOwvRtTt3B\nmhbFL8gL9IKATqKITVy5oHdIJAejfxhL0I5LkNQyoYMwHmqqbif3f5UOCtHD\np8Zn0FZXoacWevF3pNgnaycUaeg2gIC3OZMZIGIqrtuo4HbU7EB+IgR3gbQ6\nw5W2\r\n=9bMy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGb75h3nFRNZGtOhZUcdDiu3S/OouNNeW41JTnyjyJjLAiEAtNgziPgEdFngue3YhCsMKDjKw2YDu1W43tGs5Vn0kYQ="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.2.24_1615558854969_0.46988177765567296"},"_hasShrinkwrap":false},"0.3.1":{"name":"wechaty-redux","version":"0.3.1","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/mod.js","typings":"dist/src/mod.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"redux":"^4.1.0","redux-observable":"^2.0.0-rc.2","rxjs":"^7.1","typesafe-actions":"^5.1.0"},"peerDependencies":{"wechaty":">=0.61.2"},"devDependencies":{"@chatie/eslint-config":"^0.12.3","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.16.2","@types/glob":"^7.1.3","@types/remote-redux-devtools":"^0.5.4","ducks":"^0.10.2","glob":"^7.1.7","pkg-jq":"^0.2.11","remote-redux-devtools":"^0.5.16","shx":"^0.3.3","tstest":"^0.4.10","typescript":"4.3","utility-types":"^3.10.0","wechaty":"^0.61.2","wechaty-puppet-mock":"^0.29.1"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { Wechaty }        from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { Wechaty }  from 'wechaty'\nimport { Ducks }    from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### Main\n\n1. Upgrade RxJS version from 6 to 7\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"e86e9a7c1fd756339a138cf5bf51dfff3230a87e","_id":"wechaty-redux@0.3.1","_nodeVersion":"12.22.1","_npmVersion":"6.14.12","dist":{"integrity":"sha512-jp7LeXYcL75O5REiRN6dA5hGMqb2DU4HP+CGAaOgZuOfyz10WyLYfId5BdjcGEYrPu8oGnZWfOdmqSsLYfBJ5A==","shasum":"679bf9766287cb4b7e492d50d4dfb940f53b1c82","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.3.1.tgz","fileCount":115,"unpackedSize":533965,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgtHzLCRA9TVsSAnZWagAATwMP/342HcIElET3ZX8+cGJ4\n+faSePbjGF5LxW4vexfHcpZqZVzjrVNp8U8GTaHVCDOS2n2NKtZwzNSK7lNN\nRy7F9p1tL2bieYAN11N4Puhb/1PzS8LVu8m1dwvDxjtQoss7LDQBYqgUFn7u\ncuq0uefpN86CCGwpGIEFMkBef9Fl980mRylSmrvtxHQAyDF3QBZ7UYtwU7nK\nSNRINM34dkGNAxNq6DMBu02/WZEN1ohjo4/FwOjNEO+dTvS/4ilbelv/pgX+\nbq7rE+KT3tomZ/ntzPFeUyH4WIFXeTBwjWgcoEO/uEn16U2OtSj/8Nz0Bvgy\nAI5TIYAz4ByOaQW+F2PFN7OjGagVH33BRt642wNjO9yqATnFEDKoA3Pgbd+N\ntBHc0KTbEPnrXi8SKYTAykntmVAKROoQ4YWMvasheoEIfzGnt1YeQc0Qw5WR\nOettsRsm1Y5rjKPW01LSHyv5LgaoJSgLfqtQchY9kOazuuew/LRtf0Nwdoo6\nGgThbNFItCSVfDxCV8Zv5sWLbi9YLd3fNNKSQUvOGrzU/BkoKQZDu+PE6WTI\nEtpii09Yu9Ipsi5x/fV32jA2WlJa9c8e5NQHPgCETfKUNUFkI3EaHv2Kx3a8\nytK8lPgEeRKqm63WpyxtfOdrorzbN5SGtYonMc4l9wdCQuS2nXKIqABUrozd\nefa1\r\n=BCNK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF+ypXP8llvW0FR3AfwevMvkemKlFTJUx2C4F7csx2RFAiEAj7kYzFpLMTNAAww4HHXgLS5avPUQChz7dr0f7n/GroY="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.3.1_1622441162906_0.41407225782012747"},"_hasShrinkwrap":false},"0.3.4":{"name":"wechaty-redux","version":"0.3.4","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/mod.js","typings":"dist/src/mod.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"redux":"^4.1.0","redux-observable":"^2.0.0-rc.2","rxjs":"^7.1","typesafe-actions":"^5.1.0"},"peerDependencies":{"wechaty":">=0.61.2"},"devDependencies":{"@chatie/eslint-config":"^0.12.3","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.16.2","@types/glob":"^7.1.3","@types/remote-redux-devtools":"^0.5.4","ducks":"^0.10.2","glob":"^7.1.7","pkg-jq":"^0.2.11","remote-redux-devtools":"^0.5.16","shx":"^0.3.3","tstest":"^0.4.10","typescript":"4.3","utility-types":"^3.10.0","wechaty":"^0.61.2","wechaty-puppet-mock":"^0.29.1"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { Wechaty }        from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { Wechaty }  from 'wechaty'\nimport { Ducks }    from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### Main\n\n1. Upgrade RxJS version from 6 to 7.1\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"0f166ebe1e474615cf50e55c2f4c2606a446d568","_id":"wechaty-redux@0.3.4","_nodeVersion":"14.17.0","_npmVersion":"6.14.13","dist":{"integrity":"sha512-ZsKaJRL4+itnYDGutMc7VVQYQEQJrQs0TS1SNaeI+O3G2PYiJ4aHhHwFuEUXWIFxY9Rq15DDDc/R65dYfwLe+A==","shasum":"a26aab63a70187cd83824d91ea8bdcf62b71f85e","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.3.4.tgz","fileCount":115,"unpackedSize":533204,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgtUQACRA9TVsSAnZWagAASVQP/3s73NntPF0r3xBiXsxx\nq9l0rNfkqld8h1e7aK7R5TK8JQECBBbRqvGqqKrqynrmRJ4svRfGSrCqE9E2\nTH/xDtpfkpGOFe0XK7VzV36/jpdb1Iw80kAtP95wEzt4pjUs4BvMKwEyYPmP\nQ34L2uZai+rNEmT12MclIzDmr1vrc5Okv8SDwz77frbTXkVkLvU/tTgrLN0m\niCYhygSEK2f9OHYYLLjZ6kdIKMTQu34z04CiIYWSkp1KwmT02UXT+lU7bE6k\njMRQoPYF0uev/bi2C8hIo9t4WI8CzcmGmXDuEyyMtt7lnx+o3sNQ3QvgAVzI\nK5ECUp90pPr128Nlxd5I1ibtd2cScGT3RpG3rxaYmGMnL3BfE5t2e20nw5oy\nh1Nf8vEDxCUwkqRGXcaQj9PIv/aEI6foCAhxsoNlOJxatYBeMRj4ku4c4Zo6\nX0GlA+lswviD1HlXFPc1gZZybxClN6fj1szws4Sz20/RfedM5evUP+HveM/u\nCKHDTGFtKrJX0kdV4okkwFGG+UivLMnrjonLCqZZPIbRjC3R/5hAvk2xhyS0\nUqD+mhrXh+NDY8AjVI3yl5/vDOtFFurSrmTJSRJdIuzwKk4fR17FLyfzh6Ns\nNYyosMQ1LlORGeIUypMBtNIe7UEQJvPYt4a+U4ayS8Hz4FtgWi8EHGmAOGu4\ngveX\r\n=ha2k\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFLH+F2jWTj6Eu2pfo4E6TKTSawe1DoEx/+YBUprYa1vAiAcqpHpknwgBOVPz2KxBTHDHWGcxMWlpCnSvZrVELHIFQ=="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.3.4_1622492159912_0.2514974162468431"},"_hasShrinkwrap":false},"0.3.5":{"name":"wechaty-redux","version":"0.3.5","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/mod.js","typings":"dist/src/mod.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"redux":"^4.1.0","redux-observable":"^2.0.0-rc.2","rxjs":"^7.1","typesafe-actions":"^5.1.0"},"peerDependencies":{"wechaty":">=0.61.2"},"devDependencies":{"@chatie/eslint-config":"^0.12.3","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.16.2","@types/glob":"^7.1.3","@types/remote-redux-devtools":"^0.5.4","ducks":"^0.10.2","glob":"^7.1.7","pkg-jq":"^0.2.11","remote-redux-devtools":"^0.5.16","shx":"^0.3.3","tstest":"^0.4.10","typescript":"4.3","utility-types":"^3.10.0","wechaty":"^0.61.2","wechaty-puppet-mock":"^0.29.1"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { Wechaty }        from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { Wechaty }  from 'wechaty'\nimport { Ducks }    from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### Main\n\n1. Upgrade RxJS version from 6 to 7.1\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"def9262f77fa52ba4c3f003e42156f186187364c","_id":"wechaty-redux@0.3.5","_nodeVersion":"14.17.0","_npmVersion":"6.14.13","dist":{"integrity":"sha512-sSn+2ZfJh4O2TR7ZPpH2TrfxSQCY3LCb9LJ0Yw/9YMeUVK1YuB4+F+m7ibWC6zatW55UXPT1CiDwmfXvAfTx9A==","shasum":"bdeee56eb4ad5cefed311c140678c494df8bc0e6","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.3.5.tgz","fileCount":115,"unpackedSize":533215,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgtUSVCRA9TVsSAnZWagAA8iIP/2AngMWJnAV/SggajIkr\n9s+NmYLYqU16/2JBdM0jMRxFPfpHgvJnb1vH0lGtZoGsuvBqazg58wQ7pjkQ\nSKUKgE82Xo0Vzr//VBSS8E7mYt3Jew88cuD+59/jJDXeREyzRr74b8VLF3ey\nZ1b8L/TFEy37KlxR5osWAJePZEJMXwDXuvAc/Q3eS3JRl9sK0BUMo//m18S7\njNBLl48UlE88SKbThpH45xjXeTE+OwwFASvULLlx008Cojg5PM1ImHCq41c/\n0HfH00qRcr1FmKI1gNoaHuuexsVAmMtSqUffxp4hmoAMrt9R3gkZam03kSBl\nS2DYFvjF//i6/5QQUoJ1NYQvI2vrGeNcwSGGlGr8UzOglVaaosd8z/YmG7rE\nxpJnWgMZ88JXrhp6XX7Tvm3M9p7N4ZOHjDIRcLfGYQVZNV0q9+Hi7uS50yhK\n4+s3E2StBYjgmnEHwN2M2n5QF0okIlYbm5+gx5XXgR4CY01yBMZ9yqNeqy08\nkbLt2ToBto6Al3S2+MG7lA5HCl/IguFdJdfdxHWjjDP7WdovkbqlzunsD56+\ndKXglUPwk+OeNAFytHy4GiACvPdBbhQwi54RAlc7Ol+o8OivMOamnZRmOqeP\nvZ5Vb4h4jGyQudC5iz3hrRdZClbARRg8qfHk24/J5qda+ciOLpTeCjLQtmEm\nfLfL\r\n=tQLf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEP6nr4OPIdRSH6BagZDMn8dN24HgR/xTi/mlVug8h+rAiEA00B/kQNQ2MyXPxyXYVl574t+DaFdv39zCzSfStyrXeU="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.3.5_1622492309190_0.306852102274195"},"_hasShrinkwrap":false},"0.3.6":{"name":"wechaty-redux","version":"0.3.6","description":"Wechaty Redux Plugin Powered By Ducks","main":"dist/src/mod.js","typings":"dist/src/mod.d.ts","scripts":{"clean":"shx rm -fr dist/*","dist":"npm run clean && tsc","pack":"npm pack","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm run lint && npm run test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"blue-tape -r ts-node/register \"src/**/*.spec.ts\" \"src/*.spec.ts\" \"examples/**/*.spec.ts\" \"tests/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"redux":"^4.1.0","redux-observable":"^2.0.0-rc.2","rxjs":"^7.1","typesafe-actions":"^5.1.0"},"peerDependencies":{"wechaty":">=0.61.2"},"devDependencies":{"@chatie/eslint-config":"^0.12.3","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.16.2","@types/glob":"^7.1.3","@types/remote-redux-devtools":"^0.5.4","ducks":"^0.10.2","glob":"^7.1.7","pkg-jq":"^0.2.11","remote-redux-devtools":"^0.5.16","shx":"^0.3.3","tstest":"^0.4.10","typescript":"4.3","utility-types":"^3.10.0","wechaty":"^0.61.2","wechaty-puppet-mock":"^0.29.1"},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { Wechaty }        from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { Wechaty }  from 'wechaty'\nimport { Ducks }    from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### Main\n\n1. Upgrade RxJS version from 6 to 7.1\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"060cd023528dc544b25a4950c2202e0821320d0a","_id":"wechaty-redux@0.3.6","_nodeVersion":"14.17.3","_npmVersion":"6.14.13","dist":{"integrity":"sha512-fLchd1aFjPLD4cDrxQmX4Kn5v6i3GDLYMlkGSZykDsQXmWAVxnCQYPrjPzmCHP2kdcfLYr1I0TQotL9XGIkrRA==","shasum":"5eea33587207be6373047ef5d485973fbbbd7e6f","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.3.6.tgz","fileCount":115,"unpackedSize":534233,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg9QaKCRA9TVsSAnZWagAAaEwP/3n0LVW42yw7mZmOhXTu\nZjEp9DbY78xDrpFuyT6cKeprRactp3CMgA7tJvA+EoZp17STnSTCBm4DTHiq\nCyywry4XgJ4xaymVjIfXpNjtGa4dGSVsd1GVo6piGGp84yPFaaO7Cn7F0M3N\noNZwmu+25kvo/mTUvCE1DZZBs6GnNQCxyH0vlIIR50hpd747h2Sr89FOVwWF\nDb3DX38kXKN1WyI9s6oHKJ+LAmpmLZLAlLjmKgEA3H3dk9jvMl1Y+I00oL/Z\nDFKfm1MypygBheGH9lW2yjyBDAjpaIIS2W1u0PgQ24kbM7X2X1kYjB8cgOZm\nvARB93dSCwQQESgHUg32BPdQuwBRy4/384AGXXhFXjGlPPeD45+bmYG6LQeE\nK5e9HIk1Cdd897ethSN4TANyBN3CGPB91/6thnaUAWsqppJGrzyvEVsDaq5z\nmX10pu546wnzh+r1CMoZvgCX+y2jcOYKGX9jlh5EwH4tcszrs5dzSPW3JDLL\nuQrH1xY2pLV0ROnsdvO0Vnk/InpDOhFdjsrsBCWzaVm7utQRhVmTcuFV/PFY\nJA+jB32azZTcQW67PouY+FkbUkMxRiYeP9vAkEV/uomFrwOf4kdIFEBibv0w\nUHb7e1l0PZGhIFq0dKNptZzmZ5tt6o9598ochbd4CNDDUZKX1NHvM6gtwUeN\nmlNF\r\n=PmmH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEeyqIvS3KsVXkTAokXkhrWVc0vv6Xl+zK+Au1zHPpqeAiEA7k+3t2j4o5djozgVp2zayQMjulja9faLqm3O/hGfG+Q="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.3.6_1626670729936_0.26240573779320386"},"_hasShrinkwrap":false},"0.5.2":{"name":"wechaty-redux","version":"0.5.2","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=0.69.41","node":">=14"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"redux":"^4.1.1","redux-observable":"^2.0.0","rxjs":"^7.3","typesafe-actions":"^5.1.0"},"devDependencies":{"@chatie/eslint-config":"^0.14.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.20.2","@types/glob":"^7.1.4","@types/remote-redux-devtools":"^0.5.5","cross-env":"^7.0.3","ducks":"^0.10.2","glob":"^7.1.7","npm-run-all":"^4.1.5","pkg-jq":"^0.2.11","remote-redux-devtools":"^0.5.16","shx":"^0.3.3","tstest":"^0.5.16","typescript":"4.4","utility-types":"^3.10.0","wechaty":"^0.69.41","wechaty-puppet-mock":"^0.31.3"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { Wechaty }        from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { Wechaty }  from 'wechaty'\nimport { Ducks }    from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### Main v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"71d2591c3ab0352a296564cbb90c4527c3e200eb","_id":"wechaty-redux@0.5.2","_nodeVersion":"16.9.1","_npmVersion":"7.21.1","dist":{"integrity":"sha512-H0Mu036etaPumn65g5PJv1kjd7lfGv+BtsbRh5OAZwTOm0JT1SDMtdcfYYVisD1nJOa/i2AKNGxq3pqnjtLmwQ==","shasum":"a40cb35b2df08cb5248db7d91a3790f8b46a7178","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.5.2.tgz","fileCount":189,"unpackedSize":944971,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhPexACRA9TVsSAnZWagAA62AQAJPD5SFSSp25W88XEp1g\nqn1vO1rDemwDHVpyxL3nbuPpHz7ECkmfAPK2Fo5Lg+EWAkGkShy52k2ykvPj\nO0UL3qsxtDF6sPC7iXPYeo9kio3uaoCeEZTwinZVRDOBSzhLTNBOy2c/wJqN\nhCE9t4NY0GyYRrbGyjlrDKq6s8ElOMv2hcNv8HCqb4YSdVa7bJy4EdCWSLGk\nR3i/Ut91OCEgFynt/2vmY5CPqcLKFjJ7wcQSpwxKSULDWARK8h19PhPN1AFS\n4DB2LHD7zoAIYtvB3Rt//N17xCBJlwdOB10513+Y+9RqH6zgbUJbNF1jXTDZ\neg/mhQFdjcBeZxwQOIrLx4QCaRp19RyXd+i/TyoR4ZFN2PSIQWfK7EJZa47f\nXQJP5HKn9SayfwET+Do5g3BZMuwlfrk0KJE5wBda3IeAJAhFhWxM4Lqoegxj\nroTk+BQ9AXcJAucA+xET3b+FQWln293s4NHd2jz25EzbQGAJYcUVvmKEFr3A\nG4aAamxpBUyUZj46tNjnav25SVxWjLqvQGbX+8+I8GlARTQY+8v5OMVdFDp7\nsYbPK4UIUReY6I0PlSFsOKRPobZqU96paJfOTjBiR7EGwy1vlA3a0cF2oIxb\nRfDVMFCy2/Xm0z6gn0NallZDJtuYggWgFLlSNuuN/nlip1uxXwpt3teDux/V\nDnlJ\r\n=trVf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDihwsbZ3gSjz+h4vYaPfjLXQVtVgTFHVJjDWH8Mc6lVwIhAIxcWs0j/Krl1t5YGxsk8EBJyC2i6lUiYfDgnFFDhezW"}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.5.2_1631448128300_0.4681338618831894"},"_hasShrinkwrap":false},"0.5.3":{"name":"wechaty-redux","version":"0.5.3","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=0.69.41","node":">=14"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"redux":"^4.1.1","redux-observable":"^2.0.0","rxjs":"^7.3","typesafe-actions":"^5.1.0"},"devDependencies":{"@chatie/eslint-config":"^0.14.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.20.2","@types/glob":"^7.1.4","@types/remote-redux-devtools":"^0.5.5","cross-env":"^7.0.3","ducks":"^0.10.2","glob":"^7.1.7","npm-run-all":"^4.1.5","pkg-jq":"^0.2.11","remote-redux-devtools":"^0.5.16","shx":"^0.3.3","tstest":"^0.5.16","typescript":"4.4","utility-types":"^3.10.0","wechaty":"^0.69.41","wechaty-puppet-mock":"^0.31.3"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { Wechaty }        from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { Wechaty }  from 'wechaty'\nimport { Ducks }    from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### Main v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"be43f8179c7ce57bbd566ffd00884191b03d52f2","_id":"wechaty-redux@0.5.3","_nodeVersion":"16.9.1","_npmVersion":"7.21.1","dist":{"integrity":"sha512-k4MLcnySWVJQT6gamglX5Od15IOkj5VGi2FN+mNnsSDPCfVwO26G7F2katf1zz5Veg/RTtoEytlGil6Y71IwnA==","shasum":"8852a824a0e27392a4137819e434093122f57b72","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.5.3.tgz","fileCount":189,"unpackedSize":944971,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhPex/CRA9TVsSAnZWagAATNoP/ighIUuxBBgNCi5vwcV1\ncJNguoTE9+O6+wNGhiKVaNR8bP87JC561cZNA5ZNXDf45wJdNVF+57TLZgE3\nGBbVdPTbgYIxliSdoLkTZQF0lIiOQauwkAZuaQq9XaqDH3DEOP2FfZhKwYr5\nl3U6FHdvAdQYxhv0GDnzW5JMjcV5eBTZcLswlFJY3dO+6Ytx1N2mBzJ9Gt5U\naX7YFGOcdypDeDTp6kmX3/dfPcGWsJkDXR2AuBJpNF6z8yfPTU+puVDWHijw\nTMDK5cszWZZfDajDSVemjdA1YG7PDz6hMxX33CmUHnk+lQOVcIOX59RY9wX6\nJDnmOFvuId4tQPvo3S2dPhHpiuZsXaQZdyAPrRpO1KlkK8Eh2tocXcGzMmtq\n8unR19/EQMDCPCirI2HT3HBidl0t8pgtXxm+QgbELRdZ+1gMz7owl5rwflNe\n1T0s9blqmN3PDtWSl7F7RkdpXcu96W8AESB/iZKI5PzcOn3lZ5N26nPsHGGw\n3oRJpchfHW4hl7jnuwqOTWDij7kN4Cal3+l409er6cAFcww5WnG1YryfwWG7\nbgwUYkYitiKbODzXA8IXzBXn8BJC6Jm/tSZWcMyK8xvb80W0nrD5g1TZmfFz\nyko/8Rs+ZB+n1YfpRyoLCKzLq9Xy9y2vCfKv8VPGszbziZlgTPmldih+BGXB\n00vO\r\n=PBx6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC1dHmiEW6ofJ5g6cQXfLL+019u2olDdPCAm4pLb+q4JQIgbAytmmmZPbipm3WzfOcPFN/oQbcsoKM9dMSNajLHips="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.5.3_1631448191097_0.3440154311201449"},"_hasShrinkwrap":false},"0.5.4":{"name":"wechaty-redux","version":"0.5.4","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=0.69.41","node":">=14"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"redux":"^4.1.1","redux-observable":"^2.0.0","rxjs":"^7.3","typesafe-actions":"^5.1.0"},"devDependencies":{"@chatie/eslint-config":"^0.14.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.20.2","@types/glob":"^7.1.4","@types/remote-redux-devtools":"^0.5.5","cross-env":"^7.0.3","ducks":"^0.11.6","glob":"^7.1.7","npm-run-all":"^4.1.5","pkg-jq":"^0.2.11","remote-redux-devtools":"^0.5.16","shx":"^0.3.3","tstest":"^0.5.16","typescript":"4.4","utility-types":"^3.10.0","wechaty":"^0.69.41","wechaty-puppet-mock":"^0.31.3"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { Wechaty }        from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { Wechaty }  from 'wechaty'\nimport { Ducks }    from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### Main v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"0b15fcdc33fa071db14c585d232f3dbb4f4c5e38","_id":"wechaty-redux@0.5.4","_nodeVersion":"16.9.1","_npmVersion":"7.21.1","dist":{"integrity":"sha512-2AiA7T7rlfgYwOAaZ+JLxB/QjWiHET/lG2LiRw5hKlQ51564MN3KfBFRUkz4s5Q0ixt7qDS40Z9DPxEhfxXn1g==","shasum":"0ac86cc35a6857004895de9c089f6f33d130b0c2","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.5.4.tgz","fileCount":189,"unpackedSize":945086,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDv7auyQlaze+jGO35V0S/PkDrPrU1M3AId6SDFTeJPOAiEAirthCfPlwRG6/StoHG9ulgWXm5M7NpFD/aEshd8OM9o="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.5.4_1631973029992_0.5089561610612798"},"_hasShrinkwrap":false},"0.5.5":{"name":"wechaty-redux","version":"0.5.5","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=0.69.41","node":">=14"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"redux-observable":"^2.0.0","redux":"^4.1.1","rxjs":"^7.3"},"devDependencies":{"@chatie/eslint-config":"^0.14.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.20.2","@types/glob":"^7.1.4","@types/remote-redux-devtools":"^0.5.5","cross-env":"^7.0.3","ducks":"^0.11.6","glob":"^7.1.7","npm-run-all":"^4.1.5","pkg-jq":"^0.2.11","remote-redux-devtools":"^0.5.16","shx":"^0.3.3","tstest":"^0.5.16","typescript":"4.4","utility-types":"^3.10.0","wechaty":"^0.69.41","wechaty-puppet-mock":"^0.31.3"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { Wechaty }        from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { Wechaty }  from 'wechaty'\nimport { Ducks }    from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### Main v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"bd90cda18248791a969438f53259d32e4a9c2725","_id":"wechaty-redux@0.5.5","_nodeVersion":"16.9.1","_npmVersion":"7.21.1","dist":{"integrity":"sha512-r3UUVqb8DqWb6/19uDzC/nrN5te7S8jkxZp0qKBM3yAGP2hZ1HWFg/9zGXmyrJ3dVjgAkLTMxMMEXyR53kyf9w==","shasum":"d1913272e273aaca03445cd63bec4c3e3e55a961","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.5.5.tgz","fileCount":189,"unpackedSize":945252,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGpF2edJhf0rRRZt9AFX9pZZhPPqtwQL4U1j91KV5rOZAiEAiY+Qtiz0FTX57Pa6+4QgmwhzWVtzaQGNBtdnR0KtuTs="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.5.5_1631980580135_0.8539292782721881"},"_hasShrinkwrap":false},"0.5.6":{"name":"wechaty-redux","version":"0.5.6","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=0.69.41","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"redux-observable":"^2.0.0","redux":"^4.1.1","rxjs":"^7.3"},"devDependencies":{"@chatie/eslint-config":"^0.14.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.20.2","@types/glob":"^7.1.4","@types/remote-redux-devtools":"^0.5.5","cross-env":"^7.0.3","ducks":"^0.11.6","glob":"^7.1.7","npm-run-all":"^4.1.5","pkg-jq":"^0.2.11","remote-redux-devtools":"^0.5.16","shx":"^0.3.3","tstest":"^0.5.16","typescript":"4.4","utility-types":"^3.10.0","wechaty":"^0.69.41","wechaty-puppet-mock":"^0.31.3"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { Wechaty }        from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { Wechaty }  from 'wechaty'\nimport { Ducks }    from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### Main v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"aa5af4696c61f87f98c88f491956db66f6a91c70","_id":"wechaty-redux@0.5.6","_nodeVersion":"16.9.1","_npmVersion":"7.21.1","dist":{"integrity":"sha512-O2aymYpTIaNds4WudeU/M50MqsHmf0SQ8zgwUkRPd5mSo4zTw0Kd1ga3XIJ3gX2Vyvnw8IL2xEEBqHjyyqd6lQ==","shasum":"8034681851dff8fe3d896014b6c40d12b4953e0a","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.5.6.tgz","fileCount":189,"unpackedSize":945372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCkMzNd/amSmTRZORphUu8hxGylGoJ+CrfSbfMTiU5gaAIhAOik5/jaBjtVa99NpN7ALLyng3b1igdeZNJMcNuL2n3y"}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.5.6_1631982877062_0.43171286035987255"},"_hasShrinkwrap":false},"0.5.7":{"name":"wechaty-redux","version":"0.5.7","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=0.68","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"redux-observable":"^2.0.0","redux":"^4.1.1","rxjs":"^7.3"},"devDependencies":{"@chatie/eslint-config":"^0.14.1","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^0.20.2","@types/glob":"^7.1.4","@types/remote-redux-devtools":"^0.5.5","cross-env":"^7.0.3","ducks":"^0.11.6","glob":"^7.1.7","npm-run-all":"^4.1.5","pkg-jq":"^0.2.11","remote-redux-devtools":"^0.5.16","shx":"^0.3.3","tstest":"^0.5.16","typescript":"4.4","utility-types":"^3.10.0","wechaty":"^0.69.41","wechaty-puppet-mock":"^0.31.3"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { Wechaty }        from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { Wechaty }  from 'wechaty'\nimport { Ducks }    from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = Wechaty.instance({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### Main v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"098868e2e504b32ddb7b4c5fede960290fe70837","_id":"wechaty-redux@0.5.7","_nodeVersion":"16.9.1","_npmVersion":"7.21.1","dist":{"integrity":"sha512-3iWY4YdOPxcISvJ1fn6rO7sI7RfFsF1d+wsmHmgxgOo+ipSgLonlfukVpMrwXc4ueHVWqM5ochYTnLj13yq9QA==","shasum":"76e12330d27577958837c2a1c08d9d249b3eae22","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-0.5.7.tgz","fileCount":189,"unpackedSize":945360,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFRVy2Af0wWl8gTT+wqf19yLrwgbVHrt8N7gpwFEYQPuAiEAgQeYkm4iu+ScNc6lucK5EtrwJU2s3mku8t1PQUB++zY="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_0.5.7_1631988012982_0.4320125708989653"},"_hasShrinkwrap":false},"1.0.1":{"name":"wechaty-redux","version":"1.0.1","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=0.78","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"redux":"^4.1.1","redux-observable":"^2.0.0","rxjs":"^7.4"},"devDependencies":{"@chatie/eslint-config":"^1.0.2","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^1.0.2","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","ducks":"^0.11.6","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","utility-types":"^3.10.0","wechaty":"^0.78.8","wechaty-puppet-mock":"^0.36.1"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"c4d21f6ca4ad1d995c6982091f70149f834c2e8a","_id":"wechaty-redux@1.0.1","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-usyaX2MbBrD9lYD7v5j/i+LfYF9zD7DuYbDugSO3EnND7inL7H9BFUoZsDuVNprocKNJovDKMnQobKb+J9sjoQ==","shasum":"44bca381d791ba7a0189ec0b4360a2a204045e08","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.0.1.tgz","fileCount":189,"unpackedSize":927929,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDkR5EJqeoafmbN7QyWRrHsRpw9KBEWQ6VYd1cMrXPw4wIhAJbvfn6wkef21/RwFBGxpwE4ZTVWAs4RMYJpru/vCOkU"}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.0.1_1635353544299_0.4141525417843417"},"_hasShrinkwrap":false},"1.0.2":{"name":"wechaty-redux","version":"1.0.2","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=0.78","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"redux":"^4.1.1","redux-observable":"^2.0.0","rxjs":"^7.4"},"devDependencies":{"@chatie/eslint-config":"^1.0.2","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^1.0.2","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","ducks":"^0.11.6","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","utility-types":"^3.10.0","wechaty":"^0.78.8","wechaty-puppet-mock":"^0.36.1"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"16af0ae01f72e37f0ee286b49fa5ccf69850323d","_id":"wechaty-redux@1.0.2","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-+dSGrOZywAESQtIUrxjV/owbFzKreLIuxncZkjxetNZ8SEXZcPc6dZUZaT/CIWhQ3DHavmG6/YbGKPykwdXM9Q==","shasum":"8a779831add4be9b3aacb44ab9e9a1177beac23a","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.0.2.tgz","fileCount":189,"unpackedSize":927929,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAtVztPgzjeqsUVkWdMVHnGi8QBJTEOqzssRRgt0fx2MAiEAgmDWLpR1WmOlWwbL3TAyx9y6Dq/12qmDoItFSrDOjE8="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.0.2_1635355270124_0.7511842600839782"},"_hasShrinkwrap":false},"1.1.0":{"name":"wechaty-redux","version":"1.1.0","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=1.1.16","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.4"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^1.0.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","typed-emitter":"^1.4.0","utility-types":"^3.10.0","wechaty":"^1.3.1","wechaty-puppet-mock":"^1.0.3"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"7ff7f12b549c9bf7c6bea93d8e26aac8350d4d74","_id":"wechaty-redux@1.1.0","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-AWu9vfofXrl63vWA2swMiEsWfdYVGM3I4fzRFEaGYrvprHDy2tV3rdOF0CnWdib45E1qDbKoW3Ot40KhPuhGXA==","shasum":"2f71ce4544658aa2dec7c36026f4a8580ce5b19c","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.1.0.tgz","fileCount":189,"unpackedSize":930102,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCcQOQXAnwW4/7E0ruLkaRBeYSGFBpsi/PdoAeZV7KX5wIhAM9+8UwIu/3aBVoABPHV5DBzjJYOWs3swCzjsGYUiR9m"}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.1.0_1636472893635_0.593691497903859"},"_hasShrinkwrap":false},"1.1.1":{"name":"wechaty-redux","version":"1.1.1","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=1.1.16","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.4"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^1.0.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","typed-emitter":"^1.4.0","utility-types":"^3.10.0","wechaty":"^1.3.1","wechaty-puppet-mock":"^1.0.3"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"482e41c79bfb688e5e621d14a705f9855dbe6c98","_id":"wechaty-redux@1.1.1","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-yTXWGIiijeRo/v3uGT3w2lBiaBFsSs0gX7lkjV5BW1l0D5J2/oMISIjaYYkDdwv2luyxApFqPDvNcSaXSdrExg==","shasum":"51d9ca8025dd525b6a7546112c65ff205e4c5de4","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.1.1.tgz","fileCount":189,"unpackedSize":930102,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDM4SnZy7pgC+zSDKxLVhtCRf+1w6Ervz2j2MczgqE+vAiEAw7/Ux63El0iLO9ys+8LqjFlNLOtYIc1zPbi9wt2YWOY="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.1.1_1636473212438_0.5769286453172582"},"_hasShrinkwrap":false},"1.1.2":{"name":"wechaty-redux","version":"1.1.2","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=1.1.16","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"gerror":"^1.0.8","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.4","state-switch":"^1.3.5","uuid":"^8.3.2","wechaty-puppet":"^1.7.5"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^1.0.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.1","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","typed-emitter":"^1.4.0","utility-types":"^3.10.0","wechaty":"^1.5.2","wechaty-puppet-mock":"^1.0.3"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"07377fcbf5a93a55be3cd794ae7032e42cb39415","_id":"wechaty-redux@1.1.2","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-8ZQErXbG6eogYPmGA+rkKZxqxpusc5XSERHx8d4vy/Jc/oC53uBHdbLryazoKWtpMA2tfZx4I5Az5GcmAt/9yQ==","shasum":"cfc3979b71582c6db986143d450a38c34587fc94","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.1.2.tgz","fileCount":189,"unpackedSize":941547,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQChaH4FGnqMuxUGH5HkLUq7tWEpEdnU91UGZEs8oexTUAIgX8DR6JwWwzIhFWC2X4DROFN4eB/KiO47ttr0Tuxc3/c="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.1.2_1636638575276_0.08657332152949859"},"_hasShrinkwrap":false},"1.7.1":{"name":"wechaty-redux","version":"1.7.1","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=1.7","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"gerror":"^1.0.14","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.4","state-switch":"^1.6.1","uuid":"^8.3.2","wechaty-puppet":"^1.7.19"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^1.0.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.1","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.7.24","wechaty-puppet-mock":"^1.7.1"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"383cd132b7502a3c9983a25d329cdc22e008fbef","_id":"wechaty-redux@1.7.1","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-9E3ISowT4L6u9Jg5F79oOIzxAOXs71LwKdt2F5NzwuMNE4PGYLQmO1Gepa5Ia+HtRk/MxYltFWDXEGKYP2TuQw==","shasum":"ed1fce90f3a2667a252dd29c07b2f9b56bbc53fa","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.7.1.tgz","fileCount":189,"unpackedSize":941101,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhk9s5CRA9TVsSAnZWagAAMAEP/2L3GfmUzAaOUyp6HnKY\nKVW1/Gr7SgpxhbE+YINdH4IZeF4H32NevGhd4py65sj6kNBRmagbG7hiyLZx\n+Eb0YOnEcf0sKA7imWjHiPS3cYP/t+yXdEBYT1ZRQGTvyVvaF7a+ohI0xhQ6\nw51xGvdclhp3jDizUWznWbhvN29IGRgPtrehjnLwpgC3VcgOoQudtrT/+Czz\njmlAYoldeEXnQUpHlQYHvsOIb9LXmYvXveXHLwDiYVkFm+RK2hmofdPCdBg0\nHNZBM2kywhwY42/5ehTC9jk8hrRItHTpBNHjLBNOoyUaKFX3wNbShbc6jS9j\nkUHcMj0As2GrMNyDZbPoT1pms3gFopc/sAYXPPJ5CdKZWDFjjnZthOOiKo4m\nAbc97UKpq91Otny6mEcOXJhDbPQ1xdmVNOcPnGhpzlNH8zDEChmo6F3l4/FZ\nv/PvcoBJjkECp8l/huLOcmVoTmEKkYOMi9SLDnvsG7RWWonnEbv0ov0ovWyT\nMr3oNgOMmHWnoqQIT5N3O4sQn/xzdC3S8l7YI9rt5YlaZQFbl8CoRSNFivAx\nSzDqdkcchArnLaqp9pCjstxVLJ+tEmqpAfOErZ2jrCSBT+kwLanWvVKyOW4h\nvqR66FdrYh5Xt3ajoHkeDEPygvNcNtLTDlkU9vFHXZaEXAI78Juc9vfsSoH1\nNRqo\r\n=SY0b\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEhi0h0OoV1ykA5PeoUi/Dihv844faoKBVsoNXp1O5TvAiAOthPqpH1Rv/NFX+gdOfIkz2Ya/9Ju7al+lml1IuOvQw=="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.7.1_1637079865649_0.664137562375996"},"_hasShrinkwrap":false},"1.9.0":{"name":"wechaty-redux","version":"1.9.0","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=1.9","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"gerror":"^1.0.14","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.4","state-switch":"^1.6.1","uuid":"^8.3.2","wechaty-puppet":"^1.7.21"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^1.0.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.1","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.9.4","wechaty-puppet-mock":"^1.9.1"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"414e8be5ba3df80f647dcaf384923a9650defefe","_id":"wechaty-redux@1.9.0","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-beNidsmSACCXiC4n1tXYULgJr/83b70iKOrIkg9rlYJb5XChkRFE8MCXrIfhg8k9qNux0C08eCg4l1I1XONooQ==","shasum":"f51213c3fa9a5433c8b875a77e018e7e0ae63d07","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.9.0.tgz","fileCount":189,"unpackedSize":942872,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhlKGSCRA9TVsSAnZWagAA6+wP/Azvw5sedN0M6ZGri0vY\nFEq05ICQ/sYE1zYH92SZdhObvE/ThuHNE3H/HN20eTKVCIDj7JcD5tXuiyE2\nJozNeaH4V6beyYtksdYiHP2NwRXUu+4d2+JUBCRYfHtBpKx15lE1ffPGiKUr\nM/cxHnzImMXxsdj7+dAABgHog3WNYKZ+nhe4/l5Rq5AjJD6DVigiJppsCBra\nOso6M39uwibEGlEOB02s3pe4H2R8klDf9t8uHuXzDLWfv3iIaVcjzBnmm/vn\nbtLktSS2LfAbSb+W5/rlXv+QB2SEW42LRwUtR80KgrDInCcZDWsVit++aDdA\n7G+ZcQyp135i1k4w922/01DXj6n3TPVTIrXuyK9XtXsq7W/i+P3gdd4PW5PP\n0eBp97VFG4I6ZOw5zfd9Cm0HusS6Dp+48r3VLnhahPLhFG1bFYwyuZ2gHSZb\nsx0zDR26YddFTcrMOCxY2wfL8x7JWNIatYBMLkg/4nrN1RwhZMdzMbl24H9x\niqTZZjPQjlKrGXnEedE3qNRB0Kfu/l8K3nNCLtf8jX97AN2DWuFqHEb3WGD6\ndlZ1KLo3AE7e5gfRqOxNN4kNBPA5Wg/8PawM1NqUKubBjW5JBL4g71MDE2WI\njADu5gIEQW/HXFL1UYAPU5I/ycw3ywo5hUzOuy3BTB9q+TGT0GylRnhWUHCK\nzoqy\r\n=Sk5I\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDnO0TWHg7iws2xFuBVwpMYhWmNZDW4l9GmZTuCyGqXVAiAO6ta6rB4h7q54JDjDgx3PGSA9Cby8UnEtO0cMOXdkWA=="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.9.0_1637130641894_0.6460041123891445"},"_hasShrinkwrap":false},"1.9.1":{"name":"wechaty-redux","version":"1.9.1","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=1.9","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"gerror":"^1.0.14","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.4","state-switch":"^1.6.1","uuid":"^8.3.2","wechaty-puppet":"^1.7.22"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^1.0.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.1","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.9.4","wechaty-puppet-mock":"^1.9.1"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"1c0a3b66e0d9cabe3be2ea33d3a96c1b48e5e553","_id":"wechaty-redux@1.9.1","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-OXNm2XUbuWo7+z3BoOeuNIp8wSfu7FPh2OrSqxJMQp5qduGi23iufd9ocgaUHBqHEgz0t6Qcc6OzqsFr+yAp7w==","shasum":"af58c93f48f966eb51d7bbbae46356588d082319","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.9.1.tgz","fileCount":189,"unpackedSize":942872,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhlKHYCRA9TVsSAnZWagAAlmIP/13+eIiY0uIa0KgBGdx0\nN4BTOWTgvTTzL0UuMbi6WEyOacyDNAeml9g2etFTMkFaKy/D8EXL/y0PcSYq\nL4wcCmj5aGRWDW7PHTjfmlmZ5pnizZZKOPdqpB0PcIn5fdaYWjSStnv/zmTG\nqvm6RnWWnFcZYad3ArKw/btRpmV5Dg+czdcOyNy5iNVrnAosX3U6TSWQR/bO\nC1wUBK7+7psrmx6i+8T/84n+YsMAeIMnV8qQJxk7gX/wCiSY1pLVkM03xHVQ\n4ivA571RGtvtR+5ikNXp2VJGXii7N4tgmwMcXTi7ZoYzwB7c7RHZ7YjWjXkq\nlo0w5lrJcsnLgU85kMRXK7juYnChrm9TJpgPjZ4jPUZq0MG2REfVMou3+dOL\ni+ZDazLdMCWbbiqeKo4jU5sB+kKwxymn/3Zqml/QAttkcMzQeGfR0hbG9je9\n1l3mo5fvAnrjC4eZV+oqdRrIMcNDGP8rTeZkzpV9F7u+a/D9vEeq4FaPZ9Et\nuhSkXNuL1tmu+/1gNCODBNfFDasx7A6BPl7+IieNrPNLh+IXskUnKF7r6Qo5\nl5m9gNcxrJeBilNU3t6JwhoqkX6k0cHLCGApPHU183XP86mgfwNv8gL9+zNU\nHBSH4N9EdZsD74Z/1C2BfkOr+9cyHFg8wYoYganjxVy5Kl+HIyPCiEolYeP5\nLYUx\r\n=GAjM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDEnn0H/esFwnfzdpX4ucKDm39q1yM9K0bbHsdDkFlCzAiBjEAV36JI6JHJ+qv3SPv8x/32LCQV296PxaI/BXlu3rA=="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.9.1_1637130712180_0.6303566013231554"},"_hasShrinkwrap":false},"1.9.2":{"name":"wechaty-redux","version":"1.9.2","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=1.9","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"gerror":"^1.0.14","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.4","state-switch":"^1.6.1","uuid":"^8.3.2","wechaty-puppet":"^1.7.22"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^1.0.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.1","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.9.4","wechaty-puppet-mock":"^1.9.1"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"c8f72ec4c2d87916c372751c72ee0f44bd19a62a","_id":"wechaty-redux@1.9.2","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-Fsz6KWEuZzP+vgHPUUGkqgh5NFNhX9HuinVGuSQpB4EGZg6tH9EaSsYHmMSgE5xrRBzj9TRZqJ9qnhUBXheAOQ==","shasum":"b96bac4b10232dc9b4d35ee582ec712de1dddb14","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.9.2.tgz","fileCount":189,"unpackedSize":944093,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhlKLyCRA9TVsSAnZWagAAyG4P/jHCJ5Kl6+UOxwPD3Uo0\nAMf0ixbiCeCpUthxZDjDeLdoL6LzH+kTUpnfhTjie9gYFqKy89B9Pq0Mbzpx\ncI3edEGD58CnQ+weAYHaBbuIjUTVMMXdDPitMtJbnga+qBmZCiba2VA2cHwK\njHHJ0kIAjeW4lF0XNSc6AV+sNPDkSFxwvnR3QV0mq4xR/QngDrQn8lQoYfnS\nLpptphS8Jv/z+BrRyhhASCuyA/pMmookYlQmDdfLXczL/rD3rjkKris28KzT\nBLA1PNrTFMzOEQelbQOHLjajRhszUvf0W5kyVlWXq4nIWut/t7oWgM0isWEb\n4NFbnPYE6LFZyiD6JRi0TgocdWC5ASS1AEFHVjoSfimxfRx3PMNTKjNHNLWI\n9buSaFOOL+D+wE/DAgDa8tu9m+ooelZa5QgXZTanmSG+5GuPQnR81w8VLuFq\n+GCHzWZpOGr4YI1/WgRn9Vs/C7EvJ2iwiXIH38fxUR5O+lU4jGRWKYvAGavd\n9XisEFt9QLLgQu5YrPO0S3mFapiP4s87+PibRIjDYmrmIST3PyNrqbmcPj9W\nQEGDM4Yw5ncqSzcP8Hp7+CqdOxGF/f/mT+HlBrQnsCwaaKZDji7jFmD/QlqQ\nfWVZgvdrd1XJuWTnphGr9N4K207EXZ3TCUVjKoZuyFwcPIJykDcrBQrVHMF2\nTxB4\r\n=1RYA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC6MYU2Y2iTIfqZlwN1xLWTUy9aCPIWbsoZQbIK7i4HaAIhAO7AOvSbawy5N3nvJbjc2DQ1YV0E6U09z8frVmRyk8yL"}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.9.2_1637130994171_0.2076691071641137"},"_hasShrinkwrap":false},"1.9.3":{"name":"wechaty-redux","version":"1.9.3","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=1.9","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"gerror":"^1.0.14","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.4","state-switch":"^1.6.1","uuid":"^8.3.2","wechaty-puppet":"^1.7.22"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^1.0.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.1","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.9.4","wechaty-puppet-mock":"^1.9.1"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"9d29c71e90e9a0e9254527a66ccfc1798f00024e","_id":"wechaty-redux@1.9.3","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-ASjyfKbrQXOMwopV4XuVVHK4M+bvmZdIAEtnkZ7WbwSZuy9EAUWGI+ZKiMjVY/i1k0i0UQBfMALhBHDa40r1Jg==","shasum":"8c4c8356a00656b7abbfcd001baf4d30b5be01a4","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.9.3.tgz","fileCount":198,"unpackedSize":951329,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhlK03CRA9TVsSAnZWagAAuSQQAIwm0wBKFEew6P6Mu+3s\n3fMi9hxi1kBZqkxpo1nNvkub9IGCC3uCi2Xnr4Xv1RmTVkDw3FpFgkJI3iCv\nuKObGY9ESptRg6S89ZKKde2sZA9yzSal/DWon87OgLIBRXaofUYVn+ujcqk4\nY5eDzzrEHPvpAsBBYiGUFTnvKwvqenUDlzPgi5d//GlKnLt/9rLNUn2p4zrK\nAgTmBYBsZIQJcnnEiY1Noven27JSsBpv11khA0Jxd5jHncLD3fGvvX2vY8nc\nH53tFlH3JFhH/sr7nLegFuc/udalPG7Jbw+/9zbFFxRWtbdyg+KAAjQlwk4j\noHTEOSLRttXPYpb387B/D9bdKtWMPHJnRhO+nl4UGMiXpmbzCe5iUQZX+eBf\npRS+eFFHIOKQi57jzzzfhe7MfA17mgFdwdcb+61zvlwCV2FiRQ0toLXwTSKQ\ntUPEYkSORQwzuOll6631qGNgbH60vAgJGSkKaRGrwePRNRPaeHeF/RdNrTa0\n2UDNGybYlRatcbI1lW2VjiPhtmM5r1FJfMp/FTrFPQ4rgsHb0ei1+TpB1IIS\ndVpIcn9LF0DCHzxux/bft2n2difwc6aaPdoWd3J8hq2o9lqoFYl5DuZHuHud\nsVCYL3mpOi6BL409Wk97jJBoytIJYFOgVLGw/+MeLkYDMe5VPLHqaGVhzBSQ\nPhJC\r\n=T7Lm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICU9WQVbIw3Bfrzqsf+9TmCUQ4oC8LKJcwC/juYffrtLAiEAruQV3Dr7OY+ZtpH44mXCAPzEDqvTUKdAiJUpOEdMTlM="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.9.3_1637133623166_0.4697424053082775"},"_hasShrinkwrap":false},"1.9.4":{"name":"wechaty-redux","version":"1.9.4","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=1.9","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"gerror":"^1.0.14","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.4","state-switch":"^1.6.1","uuid":"^8.3.2","wechaty-puppet":"^1.7.22"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^1.0.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.1","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.9.5","wechaty-puppet-mock":"^1.9.1"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"c2a44532d31c164817f837e8f18e85aa2ec3c4bb","_id":"wechaty-redux@1.9.4","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-n03VGZloO/IMTPPnGpU1tx/hRWJpiiOguHuepuww7BhX8IhY8varDm+mm8mQjDiVf/DKmHFBVdZ1ZJGfczpXpA==","shasum":"4866ac7027a629fa519b29707d69aae1a0e3c086","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.9.4.tgz","fileCount":216,"unpackedSize":978808,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhlQIECRA9TVsSAnZWagAANdkP/3OIc+C/hfwGbTPbLVCI\ndtww05TT9h4BCc9Schm0OPlBj3MD4ztjWTiz9J7XIAO6Vjl0AMTAAg0sd7Ms\nLWKcPEIFKZZt4y6iPDEDzDCP3ll71ENelH/R/SCoqKXU8XbRjmbOsO1lMa9M\nFXW4kLTh4mZK6c7s8FSgZ2BiIvCdW1Wkpl8UpiZEUAGpqKKQPZkgukiv/7i0\n22IJLeF+lMEKLg9DcThKbX8gNBykhGg3J7FgpH1vrhm6OpzQ9BPQ9nLeDmUM\ntQ51KwNMYDGZYV2sv/eNuMfvv0wFiogdJFahEGd3uZSQsUnNz++ytJtsLpZx\nkztyaMByOPtBuTdLMUa+isgs3RbStPP/65PV+TI5YQvVR/d/sc+jIHWOm712\nTaCj/gnEzvD4Lu6HGuwFndbeSCs033T27LDhum4DoToq6icIipnvdjYvH37/\nc8fQhzgcod8aNbvOMxTVYOOAMLRG/BcdqRsEVTnZgTXks1kR0ZMvEiMkr11i\naNVhuG07HS89us5CJ68G/zQN0KfA+6PvCg45RWswP76scImBu/yjZTKNhwII\ndHp2mh3jZ80LwDt7AEy1/KsRKIZos+OVc3TgO/r3z9jLmwo85iryCFHBloK1\n0nXsUwC42Spnim+Ush523BXAEHvpynjT4PqS0pkHZd3t/cT0nH+5qd5uJUrx\nT1oT\r\n=GeiH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSsZy6WxFoX9XNFnrR+p7T7tljdr66645jwG/s4qIp/gIgbL0jQGk68WdFMyjIANQdwAlvcYAgpzfrVDfhaHOJypk="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.9.4_1637155332469_0.8600946150268192"},"_hasShrinkwrap":false},"1.9.5":{"name":"wechaty-redux","version":"1.9.5","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=1.9","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"gerror":"^1.0.14","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.4","state-switch":"^1.6.1","uuid":"^8.3.2","wechaty-puppet":"^1.7.22"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^1.0.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.1","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.9.5","wechaty-puppet-mock":"^1.9.1"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"aca25f14aaafde9db3c5b9361ce4abb2262ddc4a","_id":"wechaty-redux@1.9.5","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-XAgQnUD8m0JEocBDlS41WhOK81pDU+kI5H0ZQ7Q5HUqJceTBakZW4ssme47OrEbrRzvfEKCCc3s1L6/aNHGt1w==","shasum":"b080ec56c571e0d8d87c9594ede2d1b06edc6bb6","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.9.5.tgz","fileCount":216,"unpackedSize":978681,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhlQJ3CRA9TVsSAnZWagAAWxsP/RMd9oPvPZTMkcedxZsC\n1C5qzEEaNkbWmgm7NE5KkHUTO26nwV1m6wF5V7ejCMkmVWs2GogVxEHZzisz\ngws5o9yg5ty7ib+E1Am+lYPXyW8b5PqnJ7MP+7MFsPwpnZJG/XjKKUOelDCM\neC6VXgWXZVjk1TzmE790OkDifoF4SJqiEcj6WYL3PVYJ3ZpfvJn8F5JkGUxL\n2RW+C+AyR6Z7obrDzhQkLuDC8V6vf3lJOYDtNbp6GrMt7HZVQKLXOFo+AOnl\nJBoSDLJR65BYTtzfwm0D5DyucpYLL0zt0lTw7tWWLtf3prPBeYZelC1e6PKb\nQg6VZWq8LK/B//mB8lSRrDw3ATnvzQ5STJl/7O3K94qeEMzv7rMa0I91rjyR\n/ygZhP4k/2CKy3mGzEXTT/SCOibDCfKUTAxEpQauV2GRYB4Bh1L/tJcYPAAV\nROPhVUSHBfjVBrOwf9ZYMZIZPfbxvfFxQ8kOGjeyuA6JPKHo5gfqqwTL34CJ\nZ4F0HmWXst6FS8IEKcLNAtQ8lADp0vebauDwGKwSMShvFzE1TX91McihRqso\n6clMgIKQR+U0c3kXDKVkwrW0KA4WuxMKPAjZfpoTx0jEWDl3oQBvtE+dAT6O\nM8Xmc48orSSw2pSIgfDjJxalTdS8TsRM01YBrqfokbZ3Pa/L5O8u48+bwyQC\n8Mih\r\n=UcTY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDI/nfhE5Bfo7rWgW713OHW3JcjvzGzsEMrUSpy9b+65wIgLW+2gBXqKOHRiWzmfBYyR/rIv9dmetDA23vOPR05dpg="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.9.5_1637155447416_0.7488270432379762"},"_hasShrinkwrap":false},"1.9.6":{"name":"wechaty-redux","version":"1.9.6","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=1.9","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"gerror":"^1.0.14","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.4","state-switch":"^1.6.1","uuid":"^8.3.2","wechaty-puppet":"^1.7.22"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^1.0.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.1","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.9.5","wechaty-puppet-mock":"^1.9.1"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"d01433a6aa39d88bae1a7a34c40e1eaa4d0c499e","_id":"wechaty-redux@1.9.6","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-wS5trIM99tB+N+K27LqNn9Wph5jijWB19SwUINUVMcLmNt23QymZug5wPb1FXGsvYsGumFzSSzq3WbAH54FDGQ==","shasum":"9a5b117a2c589c98dfe4fe0bad03a02d116400c8","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.9.6.tgz","fileCount":216,"unpackedSize":1030132,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhle7BCRA9TVsSAnZWagAAezQP/ih+oyfQVKuGWEzlJycq\n+MZxhbnUZiLLUfqccmZIVb3O3TC9cQzbEXstAdyWhFwH/7+JCrTjakSggOiv\nBYChaci/i3ukYAZzicWKqcQdRs0wBZSuJSwKuIBVDrHC5xAuw+w4Zzuayxhn\nHozN8DAFoNKe8JxS5JEDR8FXLzkvGNFlpDbWQFOR82FnZ9Js3qtf8Y0A07Gi\nPvw5WUSGeFLZQU6cvqBJSqBwHPVYH8pwQCYpZJLE3EE4QaOFXzA7mQytu41X\nHmrshopux0vFM6adUg9rLdbWS1T/RTGDrt81EvUcuB7SG+qFofHdRF4xwzeQ\nlEx1P5/qP5EeyEieKgtSf/VCRItCEM+Q7hllJIScvgtfYwTdeghX1tjaPRrP\n89C4CphxIRm/H4eYO6+giduwywfDsYBmIIGkGjT3DKEmSunPevn2PylTBXwR\nCdFsN5MXNaaXgkUzLBpCeGWafg+7eXCsKXwJGoH7gfEAGTu2BzANK2l2l/ql\nCdbl3ryP1R+gIckZzcJ4AATKW8gpSj++FiZIBH6f6JOffTpj4uXdMC13DqCq\n1xYTtFC/aBGCVeWrUgb3ITzoIrks5NjZ3zEyg6xVYpzq4yeivhbBZrbOEfYW\nOYHBvho/Pzdu3jcH9RaKr8uwox1TQgf+eKLTckebUX7MUObnOZCFujiPyetL\nDUT8\r\n=oJ6e\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDvHVok4Q5ub5hytc3SGLr2pNh1sFbLIdJ1e5iRGUmAIQIgZRK3l7wuHzWjrEci0Zc0dEjIsYjycj2WAsRbu8oe0hI="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.9.6_1637215937233_0.1851082683079035"},"_hasShrinkwrap":false},"1.9.7":{"name":"wechaty-redux","version":"1.9.7","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=1.9","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"gerror":"^1.0.14","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.4","state-switch":"^1.6.1","uuid":"^8.3.2","wechaty-puppet":"^1.7.22"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^1.0.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.1","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.9.5","wechaty-puppet-mock":"^1.9.1"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"53dea1b19446103220ca54bef91c2ef412b7e87a","_id":"wechaty-redux@1.9.7","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-sfK0mwlTm9MUAMbOPxej/1430Ppv0GrGWAKzUs62xi3OlHCyvZRUpPf3uh04zbvw10Ntx6z7gyfiEer6UMx/BA==","shasum":"6106e6d623c151650563950f0910a2fad105b986","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.9.7.tgz","fileCount":216,"unpackedSize":1036895,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhlh6QCRA9TVsSAnZWagAAMeQP/3lP385ExxklKBPW8lYJ\n8Hr14yX8Av7Px1ePxjF/Z9TpbufzSa9kyboIQs1KwltBUl1rRyqlwWfnL516\nOXbb7kCHSf7bdDvYXsWbjt0i5u4qw1RTbNmWirhJTUUz1tZ/DGLaptEWquOn\nIc12L4JgUqtH6S80EGVL1neT+k5EiMcyRfknpSJ6GJmDEPfNViVwuhpNfPvW\nc1c9+PfM4Z7+gbojOwd1k+UXSCQAxha3jkX+zMAs8CkHl2uHGeHNds64Hllo\nRwQMjCSjpvszHN9Tu0yL65lkyv1AXI+nN6GWAz4EQbKfNysckLMqft+WCwBT\nlvznUZxgSH29FgQSkRdR4wUTOAxy6UlzIF/whasbZ+is/gK2ANIu6cgcK+0I\n38jIxKbrZ62PtgBBbm2d6hzd+3mKGlYUCXwpetyQgXfg/AdUsoZPEJ420Eln\nYIs+AoWJOqyDQvT87lkXB/i/WJPjnjL00XWKLpnr+FQxBTrOMcGfLwTVIXVL\nH8fMFEiPcvsR1O+CKh5MHna1DLnOZ6MQkIQKeS/NKfsc36B6YoHeutIGhPs8\nSKaIwdCk1mXg5IrSdJY3eGh3v+B1rq2lIY9Qe9TS4D1/tvFICXT0P3Ji433i\nZ6K6Dv/VLSiy23kpTw5Uk4mGXKS6ziZJuFLIw6G7+y3qHZwJoRgrDHIaTH9i\nvbkd\r\n=HTjW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDuuh7bgeYMDYTm0iKlMuC3akjckgmdJ+osfWUTYeA6GAIhAMIvcyH1ghs1OexcAD7P9c2qhi73x8O+TP5bTN3Hs6HJ"}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.9.7_1637228176210_0.7820075615380779"},"_hasShrinkwrap":false},"1.9.8":{"name":"wechaty-redux","version":"1.9.8","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=1.9","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"gerror":"^1.0.14","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.4","state-switch":"^1.6.1","uuid":"^8.3.2","wechaty-puppet":"^1.7.22"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^4.5.1","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.1","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.9.5","wechaty-puppet-mock":"^1.9.1"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"f32768f7847396304e6a6acbee4cfe1fb5682560","_id":"wechaty-redux@1.9.8","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-ElK0neHd9pR78mIqookMF87wzl4O9/Dubw+jF7q4B7SWsR2KEVsiFkddV4f0hw7WxKnUcBSIjHVtSqqrlD0TTg==","shasum":"de68993e7c8627d393a597223581b35f0f86a963","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.9.8.tgz","fileCount":216,"unpackedSize":1036895,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhliH7CRA9TVsSAnZWagAAvLoP/0Q6M/TGvy0TRHL6pt6B\nMve9pqzne5K+pEjXbXX1Xv5DwRqyYklSFC8OWGHFu99GURiQpO+NamFkkPTM\nmj0nHrbf/UGjmWosLkEL6MGSpQ8DyoVoBNkv56V+b3dGmVzOuJPrVHCcCxGx\nWzEzyQSmFIEZJ1h4eHP1MjXvR9a+cB5ztAO1VqcHUHQO50FLvOmoahnvBEqv\nOTAIiUzVD8TecvghzHP3hN7ylcAgjSAAQ7+olofrSEqFeuef9NtWrZh1K8NV\nCljkzk2sUiYyM+6zFUEHNIzx55uO825vfcIFY/aZ66meXndHLzJbIa2O74lp\neNE8+rtitOrJ9ZDkH8TBQU5vsmyvE0rsZm+WI/ML36jBGM5/LtHg1Sg95qSu\nmzJQUdP1JxOWXJZ1+SilQOSzn1W4ZHvuyA/vDuUAW5AGkh78yoYWFJARgsQb\nRAiHt2dcwiqZ0mwxBig/Q7w0b65jakQUrX1/7Hq0Wrhrz2Sh7l60/HArjJMn\nQrwVdcnCMovskxksRxfdVUwoL8ygSHBL8wuoOtjtIhOWupNy6P6GCwgaqpX5\namOQ3ExkWwV/xfULfVAjlWkF/PF7xJCuVUr5TkQGcsc+i2muOTPI7dRGr9uM\nnd9nZYIPxnYefLZM0wkVMkbEEC2NE0bvISA/A5KPKPpY7xxZklAyoBHrwly6\np/Vy\r\n=rSqD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBZKQNu/ikfArUx/6O8wuZeT3c6A15TokIIh6K3Xia+XAiBlqhVr0y07mB/57m2ZsmBYbJ3NEvJqvJff1JKZGdntwQ=="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.9.8_1637229051006_0.45786503298570147"},"_hasShrinkwrap":false},"1.9.9":{"name":"wechaty-redux","version":"1.9.9","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=1.9","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"gerror":"^1.0.14","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.4","state-switch":"^1.6.1","uuid":"^8.3.2","wechaty-puppet":"^1.7.22"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^4.5.1","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.1","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.9.5","wechaty-puppet-mock":"^1.9.1"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"447fdd87dd5b1bcca724a7c86e9b0908ffd6efda","_id":"wechaty-redux@1.9.9","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-4vhNsBX26REZEzl3oUbqZu/qgEZ0yDhDRyfVHeJ2ZHPReHW1cePtez41rm+4y75PUJ86WQ5sb2FbIxRQN6P38w==","shasum":"b4bf95ac106276353271d59d06477adc0b811581","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.9.9.tgz","fileCount":216,"unpackedSize":1036773,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhloVtCRA9TVsSAnZWagAAWuYP/ish4aFWZaGf0bCsWNeX\nMfdE/smwiCDSSl4LGHB+1aKuzORpGGK6FhB2xMfbfwC8gqPi/U59IBpDshte\nlaLFqOPlsXT1Q4vEi7ITZ4eUnzeFIrHbVo5AOvUOtF251KvAosAmcMOqcEzU\nYHYIzvJeL/3FeONnyH9Lda2g/5sUDiNKlXlHZLpeibis2jL1oCjCwB0CBaqM\n34fQdQY8n5rRJCGMICJrMek1a7JTUWKT6Szy0/rk+s6p5EGC6KgEL5e6Wl3P\nOwYkhVjmSjR5PaHWopigpQOmQ8lDFJr4eALXaR+LcdN0G4CJkVqGeq4hL/HK\nstobi64lrfwnkSmMxQSCPZNkOG0/F91EfwHVy7U/8MvpVC6ERGp67OykSW1x\nyZfoH9r5n7GRGqRdFIlH4q5mCA2wFHevyGI3pmhaoD7SefbSOPkGaPiuy+nc\nA2cpwPPliD9oJF/LEUTASTyEKkxBhC4gFb62c8oc+If6C/wvJTCfM/a8m5rn\nqENAb13rmzr83aPKI8cKlVApfIuGmo8OsALWNpvgbiwoBSSZbnUiFE7R0uLH\nSuGS8iR0SoGm9FuOEvaelllT0jR0/TZ5wcBmCLPiQZ1HN9ltEALpD9TlAZYE\ntwdvSnhY3TJvAZrxcbeW0UP/X9ontfSK5jEmCT1x7eI98pb6w9wNQQtZH9tD\nBggz\r\n=sPQ0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICXfKIsvhYKkMx7K2EBNtG3IgCQJAzPACaV2UehcuZRoAiEA9gKGhQPNteFx/1p4BBsMQEq80OoN88isTmNIznhrqg4="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.9.9_1637254509371_0.33400807268103505"},"_hasShrinkwrap":false},"1.9.10":{"name":"wechaty-redux","version":"1.9.10","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"wechaty":">=1.9","node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm run lint:es && npm run lint:ts && npm run lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"gerror":"^1.0.14","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.4","state-switch":"^1.6.1","uuid":"^8.3.2","wechaty-puppet":"^1.7.24"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^4.5.1","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.1","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.9.11","wechaty-puppet-mock":"^1.9.1"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"af7702e190882453e8dccb1efc6a02f6f1b5d0a5","_id":"wechaty-redux@1.9.10","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-taTPbhrnNUz2zFBSwHT/hLMaHMFmeDM3BxXNvEHOXGRyWAZTpGv6omKev8vm94Q166t+DL28cdbzVKApb/5wAQ==","shasum":"985829db0d0d7c5ac595a47f37be2e3bf64f589c","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.9.10.tgz","fileCount":243,"unpackedSize":1363529,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhmiuCCRA9TVsSAnZWagAAOtUP/AwhQsFySUzXbB31G/mZ\n4T+pa9FUxg+M82hl8bzHxq/+oDBBY08ku9rs87SH5h4eFDYzVxaMTj87z/YD\nqwG8jOLzOyXnb3eZMhcEJd4Wp+uvPvtnmZvmpMLHGJXBhRo/COBk76f8NgRO\nqLofv3YBz5NdzFlP8AwbH3MS1Gjh2nUI3IbtZ15kSyOXsESvaAtTYQWEN6Up\nhGkhPY5pXLruKce23ydin+RT2BbyjmvprH1Jvooi/hG13aGDOBMrMdAM61UL\nHgMo23hxVnKl8Da4TpmEd/C/vuYsh/PZ7rVgaMN6ohlbqY60e++9C5RtezI8\ntzin/l51Aicy0d1HLOpgVtaJAPfieVyF0NgOtNe+vXnv0AKTaDLeRHKso0x4\nOes6DhEJR/unh74jWvgqLkSc6raRYaY3IxmF6SreHQBKaFEeEHmIUBC/dUG7\nHNg66M5M2tSBnCptiKkUTDaQAOd0Y/r3Y0CeVNf9uJ7FfdVuqZ4Yifnkcr0z\nrO+WDUzaZFk0A5B6yLJFdEhdeAyiixiVse0qrfhDVAFL9jBAgmN04V/l/0fY\nLkGfmfPOZ1fsWIqWmMmEYvucsqypreFsGXUD59apoo8QHqCrXVWdBT+EPpWC\nYnst76MKDCx41NS7R45oM2pM5Pf7zid80liVoPpkkRimtCY59ZY065iQeRmn\ncZQJ\r\n=lHIq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGlL/uXSEKmHr16/hcrOkW+w49RiI9WQRyKqS/53JPanAiAb+CHsKVuUe0m7ObgRvsfSCvktAaNnFO7RjL7g7gRplg=="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.9.10_1637493634729_0.9852734492144333"},"_hasShrinkwrap":false},"1.10.1":{"name":"wechaty-redux","version":"1.10.1","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm-run-all lint:es lint:ts lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"typesafe-actions":"^5.1.0"},"peerDependencies":{"gerror":"^1.0.14","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.4","state-switch":"^1.6.2","uuid":"^8.3.2","wechaty-puppet":"^1.10.2"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^4.5.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.3","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.10.3","wechaty-puppet-mock":"^1.10.2"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"50731e2a356056ea56fa7ef0ad0d32afe652f857","_id":"wechaty-redux@1.10.1","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-08VcMfhzG39Uscj0XbTfJ6/jTNvZDSVe+UgSjcA7E3CQIwUE6WYGTUaPACjeb27Akd+eqduYpJ9gZgYSWj/0oA==","shasum":"d3cf3c563e1223f0b5e13363e77551146f43219a","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.10.1.tgz","fileCount":243,"unpackedSize":1363317,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhmpWyCRA9TVsSAnZWagAAcw0P/1U+PZvEQ4L8SOjw5/rP\nNYdz54GD2JhUTtRHh/Sd5ieAdp3xUsJM+2kYGIKc5wrYNCS8VniZd71cvy1m\np4dfgjX88NRbThmECvOERFUWYg4tkTw0FGSYoiuiByeuxIK6fORlqBJxCK3N\nP7IfV6y4v/g6vRAIW4py7p8Qj1ZQKUPdeGFU1+ut7hFf8mHh+UVw2XmF6S7x\nN5OmklfMCnDE5009GxRlcnRqJ2lob8iqncAo9odXt6FPR5KC5dBk17vGanfZ\nFrI+GZUrzAF1KKKwPbF+0/zCxIJQh0bQEIS+wVlrUWm8LSMl3eJWd4AF5Vyf\nf4J6tasigKUIgU8Y8PVciUjjI6H3oro4oBdxilsDkMU8PZvUokvbdSQmMgGz\nA846ZMvVl6UJk9jBvRreroCggkPWxxHK7dYp8QdYbpSHGi8krYXYMcRl4ydX\n/9lAhucbNk/YDm5GBcbDmhvxXYZCYtKjChsW2qAZssmPyIIGshoTMNkyfczP\nwsrq8zjYo6qS5UEAZUgVDXiydF5OXzHYlTj+MaXV6Aa2wkqfEe7pyYSbfVjh\nm9J4mO+zDFmayGEnhRz/MDPF+r8Qft3Xi2niq8Fr96P7vEQkCVuXtP574BCV\nkfqZeS+pJrUbNEepgUttUqQQZI9R4v7nHp0vbtM13rMCWxxSsqmaUS9j/Pr1\nHuAM\r\n=5GNM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGtGETAETPjqZUdaNh/5EwS5bLzzCp9Q5N1RdTfPeEgeAiAyflFmm4ywgYI1T1b4D/2ZldNk8L/Li707U8LBiR1v9w=="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.10.1_1637520818717_0.8539252631471408"},"_hasShrinkwrap":false},"1.10.2":{"name":"wechaty-redux","version":"1.10.2","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm-run-all lint:es lint:ts lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"gerror":"^1.0.16","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.4","typesafe-actions":"^5.1.0","uuid":"^8.3.2"},"peerDependencies":{"wechaty-puppet":"^1.10.2"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^4.5.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.3","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","state-switch":"^1.6.2","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.10.3","wechaty-puppet-mock":"^1.10.2"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"a28240793b0e4d4a1d71ac38cd42f17b6eae547a","_id":"wechaty-redux@1.10.2","_nodeVersion":"16.13.0","_npmVersion":"8.1.0","dist":{"integrity":"sha512-UG8ZaF7yRgGbCjnkQgoEijCoVAUbOR3POUvtKD0MMNak1758E65RbPERoFWskrRD7NABiFE3BxhdBgpoYhDMzA==","shasum":"39352419847db509d6c71940b1fbf1e0048844d8","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.10.2.tgz","fileCount":243,"unpackedSize":1363318,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhoEMYCRA9TVsSAnZWagAAGr8QAJegF2XE2Yv94rZjQlmJ\nCRUB6MPXkYhObEFlV7DnDy6OOA2l8denR3BgiWr69XitmVedlroN3HJiKYSC\nqNBpYeZE/Aj+Des5JqPOPv6y+4Fmz4wpzMbIqsMKUFWlQj4+ZiJEYAQIRRfo\nylEFciafWcKmZv7eyaHGgXqt5d9NRnanZnMMjoGyxkjBgBvUkmk7s1RCEWSq\nGgTx6Jk10xu5EgQOzj70IqwLZtv1OuB/8AzChD79VgK0ETIgtu4nfWI81aK2\nRAcygOSwlWw8U2JaipFrCpIewBDcOgIheZYKmn9ezUPVUE97S4dLwyPurc6g\nucF0GXyb+JlmA1GphzFuSu/4yf4Lc3283AjzbHMvPmlao5ebMVft2V2fLv00\nzQ0ZridnoZE0DtwdkTEoAccJ0JNqLFYmnd/R8VIAPLAVsv3l1+NvKvQowdY3\nzj9ZgwzgnmvRNTQCC0xEgEkZeiB7Akz8N19pCPzG3vKsSoVZjCDtJJHkk2Ij\nW35gHZ0yZBqP0NInHOXfdWvSMG5Q2JCTXTshW/CbBMM7xgtguZ5qbcRQaZFQ\n2CIAtI7JfqzE/xqka7AVcjPEhBqlgA4EysOUnjSTVbLipx7t/NUvfn/J2bn2\nHt9UulPGMfHOWIaPivs94xq2jh340lnrT9gOv+PpZIIMTfFJ2X5zm1Za5aB+\navle\r\n=ebvY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDgIfj6NVC8HogSt9JyFeek7D/pkOmPlfQlY/8xWFFJxwIgQ6j7iCLDHSr8QDWaViMAebibvfk6/IEyQkX5DssCqxw="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.10.2_1637892888763_0.03859736855119711"},"_hasShrinkwrap":false},"1.11.4":{"name":"wechaty-redux","version":"1.11.4","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm-run-all lint:es lint:ts lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"gerror":"^1.0.16","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.5","typesafe-actions":"^5.1.0","uuid":"^8.3.2"},"peerDependencies":{"wechaty-puppet":"^1.11.16"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^4.6.2","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.4","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","state-switch":"^1.6.3","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.11.42","wechaty-puppet-mock":"^1.11.11"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## API Docs\n\n- [Paka](https://paka.dev/npm/wechaty-redux/)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"6500bb53d73749236d32c5fac05ccadf7d08fc27","_id":"wechaty-redux@1.11.4","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-187engWFfxYSYnx4PbN4n6mgFYjCqBrpi/l91OWTBTcBoSYIFnTZsEuMVq1H6hOBcOAAQbuPSxTqEDwzcFKCIQ==","shasum":"a6d7acec9dbc127c09ccee8962049133d473059b","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.11.4.tgz","fileCount":243,"unpackedSize":1363804,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh5scyCRA9TVsSAnZWagAAzDEP/2B5vrKyN9CxfYgTt8ti\n784cJSFQkz+sfgkYP/DmhJavtx5XLwNKFwlt5oTRwRLRdyo3vml3GIYskCwQ\nOdYO2ZUq35+80H7MseEXeItSjIACeFGuXCzQNlK6xJtAg6qYdzJf/NjgB0s/\n/AeU64buGQmxHS+NpECw9ufs94OgSeOYaRfrrMS204qZzaXa5cJ6QerpgZf5\nOfLrkXOXU/dJXesYrEoM8cxj2GRd1sZt8remRdA0CJkLxHsgt4nk+qNFDHXw\n93eFupSpa7Th4Yy1+2sti+TNDaZ5Jlnf3HJr+D4IqqR8XEP3GScql/HcYVAP\ngQ8MM7AqeUSGcaUN/a7sYyKhDLCHYOVRx+VCl1kJ9M/Fr9Xe8lopj+slNGG1\n8S2JexOyEJl9MXmHsKKOq0tOs4JTuVJmwoROLYoejijyDYK3dK62Dy94qqJf\nBdSSXgetZp/znW3AGgfV+U9a1wKHcV3A6adMkqWFDu1j1qjjB/ljF9LoA+up\nuAZwFCj9s9+0rZ9DFxz33HBT6tLiK8/5ZsTyiL9WthoiXbxXL9bsUH/8B9YH\nN0hW30U2ewYtMgl3hCkr17R4RBfPRNpm/1HWexaP2oPn/Xnl3ypZpM4btyTt\nCbDBUob1c5l+CMFU88YVnNrdQgNHmgLnd1a54zV1h4px9qhIjeu1vnyQlXfd\nFtii\r\n=CUy/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCO+PUvckDyMoBjo9w2NFoafNbVdXEC+63rUDCZbE7q0AIhAOp/1WG89R/3f0+mfhP3IUM9AqFYRO+So7utA7DXhyR+"}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.11.4_1642514226156_0.8566202968770134"},"_hasShrinkwrap":false},"1.13.1":{"name":"wechaty-redux","version":"1.13.1","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm-run-all lint:es lint:ts lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm run quack","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"gerror":"^1.0.16","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.5","typesafe-actions":"^5.1.0","uuid":"^8.3.2"},"peerDependencies":{"wechaty-puppet":"^1.13.10"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^4.6.2","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.4","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","state-switch":"^1.6.3","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.13.2","wechaty-puppet-mock":"^1.13.4"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## API Docs\n\n- [Paka](https://paka.dev/npm/wechaty-redux/)\n\n## Links\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"09457afdb66b8848d2d8c2fd9b7b86b83a303db7","_id":"wechaty-redux@1.13.1","_nodeVersion":"16.13.2","_npmVersion":"8.1.2","dist":{"integrity":"sha512-2V/JgWTM0VaHtfjc5drxnTvOXvzDafbi06VXCB3ZfWdqOrtmLDkY+7TtJprAazu7ODpZTS0m0agumUGMKUbDjg==","shasum":"98a4f424fef92686180cbefcc404a6c68e566373","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.13.1.tgz","fileCount":243,"unpackedSize":1365794,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh7MiwCRA9TVsSAnZWagAAFW4P/j9vqTWJqe1qT4m8kLmF\n1NI+qg0LtffNo7cjKm4MhOfWz1Z8KvS2emzoyP5aUNQgEXpjqVsBqmpTObCu\no+CKxTnO/Nscijez7yRZGOcoCPyPjYHu/A7MCTPRWlVmigs8rUmXgnQdLseg\n2qLHfDSJRje0HgZAg/CLFXjEFpLrJw+jNF0tjR90sn5tJkoJ9fm8gO0YobmM\n99pLun6SvUquyPj/eBpDIgwZfkXswVdDocFWQuSGV8ArekEdIsbHZeEUl2y+\neWmmLfOKefTl2ReZLSaKmkIxdWwVv3uW/RXkNJx8KlKxNvpjcBNur28QkDKE\ntvqhBAQKwaNCEqJj0aQ4EZgQsXl2mrXuQpg++ca4pOZAOMelLAN3dTvaadcO\nlegkGYfeAAMu0Gbu2YVJjB8aIaPlbj0OdrNr7E7abPtlYkMNxGHI4q1OSePr\n2MFpRCeXO/T7jCTJ3MUJxTeOkrXuPo1Xs6Ae4wdE/9zprk0EshkbKpViSUDT\nb4N6k+h8WTxK8Ab3T9NTzL/byXlg6UuoBaF6/0Hj8/lgdmSfKsbG7lELj+sL\nN8FUxlJnk8peKyHV7bkDXWC4RGAoL7PbLpsO8D8FnUviH5pbjN7FH93CzLYp\nCpV0lfEyFOHtn28EmIyYKrpBCGovskB40TptgrwK4xuIZlUA7nBpZIas069M\n9Mp9\r\n=LKVM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCMf3oLQep6KdtuJWH6+n0mPnpM7PMRSm+RQC3239HrqAIgcy260x6kOT0PfMrL48ZpoKatwMvCHd9Oe6lIEUHwod0="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.13.1_1642907823992_0.6402551865395589"},"_hasShrinkwrap":false},"1.15.4":{"name":"wechaty-redux","version":"1.15.4","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm-run-all lint:es lint:ts lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm-run-all example:vanilla example:ducks","example:vanilla":"cross-env NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/vanilla-redux.ts","example:ducks":"cross-env NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/ducks-proposal.ts","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"gerror":"^1.0.16","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.5","typesafe-actions":"^5.1.0","uuid":"^8.3.2"},"peerDependencies":{"wechaty-puppet":"^1.13.12"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^4.6.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.4","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","state-switch":"^1.6.3","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.13.25","wechaty-puppet-mock":"^1.13.4"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## API Docs\n\n- [Paka](https://paka.dev/npm/wechaty-redux/)\n\n## Links\n\n### CQRS\n\n1. [Command–query separation](https://en.wikipedia.org/wiki/Command%E2%80%93query_separation)\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n### Redux Enhancers\n\n- [SO: Redux enhancer example](https://stackoverflow.com/a/67119838/1123955)\n- [Creating a Store with Enhancers​](https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"465fdc90e07310a62b5c96f3cbd76fc2ef721806","_id":"wechaty-redux@1.15.4","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-NxsprILKxuvvr+uxoFairbbKc3nFySa2uGlugJg4qwjamyuflZwvG2dWAX/sTnFGXENfY5aZO3k1qSlWsa7JOA==","shasum":"d7e443565896a190c27028238669725ba0c41a42","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.15.4.tgz","fileCount":243,"unpackedSize":1434505,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJL1bACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrIxQ//diqIpR1SyyXoa0bffwbUkOLmohvKbh4TS/yJMMGTr6jRri98\r\nZT8I2RT5ApljNHpuU5TVjP3CVobQLgOFpYQfkMobVP0PGe6A+A52eLLEKulo\r\ntzlPBV8Wc2YmhTklac5jKYsjYECQiaVf0VeK+caiYMJDUD43MtZw6K+CJCiJ\r\ncFLJ58R3z+R2C/vQtiFm7p9JgeHNuKsyw5jIi++ZwNBQyCSka1XDZ2DcWOtU\r\nsMxZnSdjlsj+H3b4AvsYUHXXzZqKR10WiQ4OIm3KKWFbujH6xMqVuMOcEd8K\r\npLyH3OmUSDzxlcO8jweq6FRenqSILnnRXDWf1iKxPEgAdVjiyNQbArwlG1e/\r\nVq3CaUqADf0TFojHMbK8syjjG2/p849BKGaOx8azMIj58/rryQPL1cnI4KzD\r\nMnIjKevDXl2xibgdk4nLwiXDEeSANbvxNJmbQvlftVc+LgJazf6hQnWZuGQ8\r\nA0mT1woBaepffBhzIfYfmeBRNvwzyVimFY9V4HvQUs/cVA8F5Zwh7KPK6KwO\r\nZIWXVC3cPfm3p8Dg68D0/aXbVxTxD3OK1Rd3Tt+OgilwcapKbdu+G2GdOIU9\r\nn4TMBVPWJs5gO/3Ogr4Z7CQzlcc+A15E+gXf4ym7AWCkF8GRusluoqjLMvIt\r\nMrKAlvw747acbwkV4j0691Yd0nESVrCyi6o=\r\n=FeNf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGgK91/opKM/OiJ8rrdLSbnKOyKkxpSCRt+kdnXuvNgCAiAJGKjX9doU0lEWaYBoK6Y/N+Kf//b2KtepN+DmiLE+GA=="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.15.4_1646574939061_0.5191381270792046"},"_hasShrinkwrap":false},"1.17.1":{"name":"wechaty-redux","version":"1.17.1","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm-run-all lint:es lint:ts lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm-run-all example:vanilla example:ducks","example:vanilla":"cross-env NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/vanilla-redux.ts","example:ducks":"cross-env NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/ducks-proposal.ts","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"gerror":"^1.0.16","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.5","typesafe-actions":"^5.1.0","uuid":"^8.3.2"},"peerDependencies":{"wechaty-puppet":"^1.13.12"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^4.6.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.4","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","state-switch":"^1.6.3","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.13.25","wechaty-puppet-mock":"^1.13.4"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## API Docs\n\n- [Paka](https://paka.dev/npm/wechaty-redux/)\n\n## Links\n\n### CQRS\n\n1. [Command–query separation](https://en.wikipedia.org/wiki/Command%E2%80%93query_separation)\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n### Redux Enhancers\n\n- [SO: Redux enhancer example](https://stackoverflow.com/a/67119838/1123955)\n- [Creating a Store with Enhancers​](https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.17 (Mar 7, 2022)\n\nRefactoring all events with breaking changes\nfor better [CQRS Wechaty](https://github.com/wechaty/cqrs) support.\n\n### v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"c7f6bd760de00ddbe1f474ef2663dedaa1e9c5ae","_id":"wechaty-redux@1.17.1","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-afBeOBSMqk18YskMBL/N/ObE2o38Hk6UZQKBGcdqW6ho8YfA0duTSN+CvyBEn18Uki++qw3uLamg+PQftjbecA==","shasum":"7ca2ca01996171fb65378740270a86f26ba1e463","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.17.1.tgz","fileCount":243,"unpackedSize":1153252,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJYDrACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoK4w/+NzqvN3FXCmHEUzQB0eT7F3hLuH6rTBelhnsCOScyDvv+bVwc\r\n3ooYjLe17XxGTXk8u1IuwMmfdLIrfvjTjxFYvnuyykDa+WFCTyTIDmiRpPUm\r\niREndhM/Sm8eTG4HE5/0/jUY1HrdnN4c6GpEkhpcNgjNSAohW+XOkirGc/Jd\r\nrGWuM/BGPdCEoOqLlUAXOzJ7kcvdUqUsdUglxDUOvhxFoyrqJ7rpuH/nnvKK\r\nXMrgeBLGu7RbwfUwHO1ekklxT6p9Dse/woAxZ2rK9PNg5m7vR9+ewtAiGazA\r\nowC7g70dWTvUlTpuxNSZuBaAC9ST0yj4KPLF+D/mHsuT2+idRFrQKHBw3nAO\r\n2FimaV/BZgKc/15kKP7mExEFolcs39yhv3/sZChq7uzn9gSU/5PQbzINIVYP\r\ns17t0upUtwvoN1rja86KFuUGzneAf2rXcdvOZ+/EyDoBM+5+VGkejZP6jNns\r\nxdyqMtM5vA8dOjAxoXQarI5KSeAajNeEjCx4uJjTr80WF9hjt9LnbbB9shFF\r\nZBfMd10q7bctzNQw/wrpn5HGGCiIxrukie1F1UbFDlQc8FUjh4+6hHYdXDS9\r\nCMniyUq/5nT/uqeqz40cEjwAC6lbpiAKiEQcoIOoM5RL3a1lGBzIE03JR1Oz\r\nDbdCTdO74+LAFdz68GggKXvnlfSg5LQeCAY=\r\n=+E4h\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGgyzMgFHd0wVQ3IgFR4HRzd6LiCFg74PINeguheScmVAiEA3cajAuo00TTwoclf149c9w87yI37lNtKPtAqLQybkMk="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.17.1_1646625003640_0.5369305690111534"},"_hasShrinkwrap":false},"1.17.2":{"name":"wechaty-redux","version":"1.17.2","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm-run-all lint:es lint:ts lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm-run-all example:vanilla example:ducks","example:vanilla":"cross-env NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/vanilla-redux.ts","example:ducks":"cross-env NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/ducks-proposal.ts","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"gerror":"^1.0.16","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.5","typesafe-actions":"^5.1.0","uuid":"^8.3.2"},"peerDependencies":{"wechaty-puppet":"^1.13.12"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^4.6.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.4","ducks":"^1.0.2","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","state-switch":"^1.6.3","typed-emitter":"^1.5.0-from-event","utility-types":"^3.10.0","wechaty":"^1.13.25","wechaty-puppet-mock":"^1.13.4"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## API Docs\n\n- [Paka](https://paka.dev/npm/wechaty-redux/)\n\n## Links\n\n### CQRS\n\n1. [Command–query separation](https://en.wikipedia.org/wiki/Command%E2%80%93query_separation)\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n### Redux Enhancers\n\n- [SO: Redux enhancer example](https://stackoverflow.com/a/67119838/1123955)\n- [Creating a Store with Enhancers​](https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.17 (Mar 7, 2022)\n\nRefactoring all events with breaking changes\nfor better [CQRS Wechaty](https://github.com/wechaty/cqrs) support.\n\n### v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"67a223a8d142addc07a7d2cdc7e2f81bb2795d82","_id":"wechaty-redux@1.17.2","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-Bu2pCqPXFhspdZh8eFAk/ndsFeyAkK0EaZSERBmjiHfWQMRykDT9zN4t310zQ59F28jN///WQwy05+aiOULYJw==","shasum":"70a49bbd6a795412566451c05b8ff90bab0a3291","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.17.2.tgz","fileCount":243,"unpackedSize":1168141,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJiUnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoKtA/9FO0LF9Rb+ohD2xOyeYsBRSCYwRiMbWG//KRh4hHu3XI5KGyw\r\nkBZD5qzlTJu2LjzwuTc+ADCzTY3XrD0YwAIC0Hk0h6Iaoxfihk0ZQU5NovY7\r\nRJxyBLKVp4qEWStfu1f0QxU8gunAEZNbCWg3NYbvfxwyrjyHacOw878IBqAK\r\nSnyUAzo7BGrMppnZ5LxTsDFowXvYaNxVAiJYIfEeeUunH3PLkjUv0wP45SRu\r\neSfRJk+WccEQw0QWCiUuvVCSJ/KvP88HIkwKZ3etwkx4d+Q/xXLz9pbl6o+0\r\nwyramhzmVnAS7Sk8+RLbZG6kvMqvB99yv/NTHkVoT6NVCWx5/7daw7HmkYWa\r\nhMTeDqGlYWgcaiskwPV93xUVgdCTUzBK+Prv0I52zOB7V5IZ0t++vHNS7mv8\r\nc7dMyHlPXsWm88zZXba+72IhRY07wwLOllINIGrI7Ey8Cc/VEIfyuFaSg5WI\r\nB0SrHxWT9yFbaznsK8N7Z1vkmaU7yefEyKpqBcNaubHjQ9vWtJf0gQoJNJKw\r\nejrDo9f7xZ/xKYpJLfAeOxS55+80/TD2fryEV2OTrmQ1tJvIvew5/la9AHJM\r\nL7SCtSTEyB1hzZHR6csm+jFUGY4dQlA0P+7YOcTqUHE5MF7ffS9PXrQp5Jj9\r\nY5cMmF1IzGSwS1TdQctsLJ3HoegT0MCmIJo=\r\n=+gcG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDrTdAJ3zSjV5s272Tt+VW5r+Bxgx3Nsjvl1tpcOHLgaAiBEzDJ4As7290MGBNqymbiDMWMrhODEZRVHvgRrY/T+8Q=="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.17.2_1646667047570_0.6501977935625494"},"_hasShrinkwrap":false},"1.19.2":{"name":"wechaty-redux","version":"1.19.2","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm-run-all lint:es lint:ts lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm-run-all example:vanilla example:ducks","example:vanilla":"cross-env NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/vanilla-redux.ts","example:ducks":"cross-env NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/ducks-proposal.ts","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"ducks":"^1.0.2","gerror":"^1.0.16","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.5","state-switch":"^1.6.3","typed-emitter":"^1.5.0-from-event","typesafe-actions":"^5.1.0","utility-types":"^3.10.0","uuid":"^8.3.2"},"peerDependencies":{"wechaty":"^1.15.3","wechaty-puppet":"^1.13.14"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^4.6.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.4","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","wechaty-puppet-mock":"^1.13.4"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## API Docs\n\n- [Paka](https://paka.dev/npm/wechaty-redux/)\n\n## Links\n\n### CQRS\n\n1. [Command–query separation](https://en.wikipedia.org/wiki/Command%E2%80%93query_separation)\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n### Redux Enhancers\n\n- [SO: Redux enhancer example](https://stackoverflow.com/a/67119838/1123955)\n- [Creating a Store with Enhancers​](https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.17 (Mar 7, 2022)\n\nRefactoring all events with breaking changes\nfor better [CQRS Wechaty](https://github.com/wechaty/cqrs) support.\n\n### v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"9232ea674d18292028c7eb6a47f0ebfc4ede7158","_id":"wechaty-redux@1.19.2","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-pNEDuN5IEaW8VZ4ZRg2srmJePyziTq3ObH7y2AXfFlfhBzd7iiXzDb3u3FnoD0NE73wVEZI2vT9Opl2qYfSnYA==","shasum":"a176b5e9a7c5d2a3cc81ad21e982cde25c287bfb","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.19.2.tgz","fileCount":243,"unpackedSize":1165511,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiKe/BACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoW0g//d0WQZuQtBwo6UuQIaRSzH15gmcAh+SbX0ZmnqNyfZmQaCN+R\r\nwnofU9HH+VX9nTn/q6yGDgcCIizjXi7yL/4aoOdM8uabUEm/BeJCKfZUbAIU\r\nSsGXuMDmETVz585HSPn837hDMVvrFs+D9RyvMvtHKEd7tO+6/0hTh6RQEnMc\r\nSm6NdXd9fWkwbTB//scxKGLFGA9qlilPv7U9ioprIslJTQnd0lALkbOyvOam\r\nsFbsNyuyCQ8FcR98jPPtwAvVYW3mvvgQ9TwkeyebomxxWoG7k0UJ4fc6Y+uc\r\nU57eSVs3mL7NyFvsxfI2ionswhY5qeYC93efXbTwCwf3G92QpoVPDuSn6eWk\r\nkgmPVsRVAm1vNVYdHC3Qhl08ndRx6qxxOMnocTOyp3wiu4gzFf6IQoaEmbBR\r\nYWq/Tv0KVzxE/pYVoPkPRJ+21XasuvwyGGWkZEq+MBiVJolC1iPqZqXaQoyi\r\n/fdFxQVLgVA79/tjPZhSmiR+PWlRATL92B+1K8Sz4TzJvh8PMuqlJdw8rjTd\r\n9H8OKdiS6eJtswToy+zhtmc07rjTPPDDw2b2IH4QT/jiRRbP3LDOYE6dfMzJ\r\nXLNM2l4KRqh4nxHxH1a2W9wsDM7c2OEpIK/JLeuv4CT2c08RxwIahQTk9ZE1\r\n/eMtKYL90w9xSKX962zZlOdOoIGpeiW/dSg=\r\n=872R\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDvnUge/MDZ0jW21wcEijNhsjWy4fGIpf1i2Tnf9OCMQgIhAL6FiwVwXup4GD1OZcO4HaNvfdzkEWcLy5pD/MdA2BBN"}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.19.2_1646915521170_0.20458326688541506"},"_hasShrinkwrap":false},"1.18.1":{"name":"wechaty-redux","version":"1.18.1","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm-run-all lint:es lint:ts lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm-run-all example:vanilla example:ducks","example:vanilla":"cross-env NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/vanilla-redux.ts","example:ducks":"cross-env NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/ducks-proposal.ts","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"ducks":"^1.0.2","gerror":"^1.0.16","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.5","state-switch":"^1.6.3","typed-emitter":"^1.5.0-from-event","typesafe-actions":"^5.1.0","utility-types":"^3.10.0","uuid":"^8.3.2"},"peerDependencies":{"wechaty":"^1.18.1","wechaty-puppet":"^1.18.3"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^4.6.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.4","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","wechaty-puppet-mock":"^1.18.2"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"d142cdfa1e3aeaa5a0e3d38446ae684c0a27a8c0","_id":"wechaty-redux@1.18.1","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-ND1TNJsdhQD4YttOfn+ViZFzPCuOMoUVQwGWjo1tahzG029BphpYLn+Pu5B8aUQkMw/QCR1zaWlgJ9GhxEL+qw==","shasum":"64300cb21416758604843c9afe3678a7b5b9384b","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.18.1.tgz","fileCount":243,"unpackedSize":1166373,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiL1t8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpxeA//Y8ngk+8lRrO42tijobpw14hRDMxEDCITpei23XOdWCDVt9w2\r\nL9C0y09L7qYzZWs2MbSmpD8TZRHVk0TuXFKKi2nLF1js8WH4o1rCqb/UB1Q0\r\ncgtLsAgiOKq2TO0SYJ01kPARo273oy/FYLc5G7w9sb62G3+4vfLZrxQst8DC\r\niHmBQ8NhnhGJFT24VPdHVpDHgSmQ2ijRol0sAdIZ3sg/5+qDukU955uDWBhH\r\n8sy2hhkjpr59ZstysUJgqnXE3wC8lXxKk/gck9Kx2QyFLFTQC43ecPzkyX55\r\nduxa6oFc3c3v2AEGu1sjbPjznpSIqNFT/ET1JL2WvEm/5leKQbKIIOpRZAse\r\nj3Vbankx/a/3IVFGPJ5ucaI4JgHvy16Ou64/U4YS+wgSJtVWKnSbNqDV/wkJ\r\nJ3MZLB1kqImc6N1ICNBXnw2fMOMxza64JVXZnbEHBF1hheuntc2xldzuo52z\r\nj1Np8QsAyzBqKB+QMy6dudED6Zbx+lXbJJXGBtSWfhR3ymN+hUUg+qkj8Um7\r\ncephSgHvH1Iv0RjX/XdDJUAvingxKosIxuoj6WqL5AIDu7glPiWms8hpFOsN\r\nCj1Xejlb/WaT06SXn7Qm7h+ECbXP2BG4RQfQ9xKCHHfUkH/f5WWYrIokb4qp\r\nf827N/qBqCWemen+VAZiaaYhBtUTtfTVGYE=\r\n=XuyR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDmoVChxZrKuaNwIa5mbD1h093ZXS9Y4kP9b9qExySGMQIgE07UchJzBnYxhMeldPB+0UqFTc9GWsAn5cQVIBOrglg="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.18.1_1647270780150_0.5248173447001314"},"_hasShrinkwrap":false},"1.19.7":{"name":"wechaty-redux","version":"1.19.7","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm-run-all lint:es lint:ts lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm-run-all example:vanilla example:ducks","example:vanilla":"cross-env NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/vanilla-redux.ts","example:ducks":"cross-env NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/ducks-proposal.ts","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"next"},"dependencies":{"ducks":"^1.0.2","gerror":"^1.0.16","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.5","state-switch":"^1.6.3","typed-emitter":"^1.5.0-from-event","typesafe-actions":"^5.1.0","utility-types":"^3.10.0","uuid":"^8.3.2"},"peerDependencies":{"wechaty":"^1.18.1","wechaty-puppet":"^1.18.3"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^4.6.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.4","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","wechaty-puppet-mock":"^1.18.2"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## API Docs\n\n- [Paka](https://paka.dev/npm/wechaty-redux/)\n\n## Links\n\n### CQRS\n\n1. [Command–query separation](https://en.wikipedia.org/wiki/Command%E2%80%93query_separation)\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n### Redux Enhancers\n\n- [SO: Redux enhancer example](https://stackoverflow.com/a/67119838/1123955)\n- [Creating a Store with Enhancers​](https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main v1.17 (Mar 7, 2022)\n\nRefactoring all events with breaking changes\nfor better [CQRS Wechaty](https://github.com/wechaty/cqrs) support.\n\n### v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md","gitHead":"3bbef21b8d0212860f06bef7b3d78eb42331e431","_id":"wechaty-redux@1.19.7","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-Mgk/A4Lbtt+R3Mx4+kz1XSWiR4nYYxsyRpscligBocDloyMQ6/9zDhsiT4iIZZ7DJqF8iPqWFVnRJme+AAwJSg==","shasum":"cab35379f1346645a5d42d7c9629906d8e1d5792","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.19.7.tgz","fileCount":234,"unpackedSize":1225220,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiPSXpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr47Q//Rghz/07Hf4Xw5M65+t965d7ZRtX/s5Tzlcv/gRiI5Ln0bGTI\r\nISwuZ87/iknXIkggjT2f6KbUFXD1xMhVr2NPR7n6Aaizn6wXAZMO38xwWP5H\r\nsdiYeUZrMyv0qX3sTEgrQrDSS7lyLRsAZESw1tXDbJ3NepeRlv8nv4Q/triY\r\nCehGn/gGWQDABQqV9af73ytWzaz5pXIgFJdI9LZVsoMQ1tco1+OGq4kZNjRR\r\npvdYGXwQvzNQ+ZjYsMTbOCQSBh2j8w9bkg/LkxLlKgO/OGiQU71octGXpuzL\r\nt3kzOpe2OQETz3dNzkGtT81phtI5W5F+YZ4BzmbbwIrOb074LNbKSbjyIZYB\r\neVeF40fLEGJJE6p7zwbb0T3Y3C6KI3emEH0C9QMj49/4uLqrnovAu34DMli+\r\nQGUc4gvdMXP54eBUfdBgVBu/brTeM5ZqWV8dHIQY9s+DbGN1ReddA/4LjcxF\r\nLph12JgRq2jPIrP+kEcC6aG2UtDuj9xZ9SZyESWgeDyZn2wkpegIGWZUzEO7\r\ngmO/3AGWnSt9JVXsWOejQKJNKErXowkYdL+PdraxOPsZK5SQkbMAkazwz+gf\r\nF0r+KFJ40R++97/TAWgwMHgczN2xSGZa6/8ZIBiNrCBepVs4RT6IBoTpRo1u\r\n57dVDBpdU9uVMrCyx1ix8Ii8nmNTl7iRq54=\r\n=Sbpd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH15thy83x5mekyzZzeih7LTmTNwYkFEM4On5p6sHbPkAiEA/voKODVpQ/o2rE4dw9kaXoLUWn/WmsQOLAQDPcIx7pU="}]},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.19.7_1648174569272_0.7019840476728016"},"_hasShrinkwrap":false},"1.20.2":{"name":"wechaty-redux","version":"1.20.2","description":"Wechaty Redux Plugin Powered By Ducks","type":"module","exports":{".":{"import":"./dist/esm/src/mod.js","require":"./dist/cjs/src/mod.js"}},"typings":"./dist/esm/src/mod.d.ts","engines":{"node":">=16","npm":">=7"},"scripts":{"build":"tsc && tsc -p tsconfig.cjs.json","clean":"shx rm -fr dist/*","dist":"npm-run-all clean build dist:commonjs","dist:commonjs":"jq -n \"{ type: \\\"commonjs\\\" }\" > dist/cjs/package.json","lint":"npm-run-all lint:es lint:ts lint:md","lint:md":"markdownlint README.md","lint:ts":"tsc --isolatedModules --noEmit","redux-devtools":"redux-devtools --hostname=localhost --port=8000","start":"npm-run-all example:vanilla example:ducks","example:vanilla":"cross-env NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/vanilla-redux.ts","example:ducks":"cross-env NODE_OPTIONS=\"--no-warnings --loader=ts-node/esm\" node examples/ducks-proposal.ts","test":"npm-run-all lint test:unit","test:pack":"bash -x scripts/npm-pack-testing.sh","test:unit":"tap --node-arg=--loader=ts-node/esm --node-arg=--no-warnings \"src/**/*.spec.ts\" \"tests/**/*.spec.ts\"","lint:es":"eslint --ignore-pattern tests/fixtures/ '{bin,examples,scripts,src,tests}/**/*.ts'"},"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"keywords":["wechaty","redux","ducks","plugin"],"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"license":"Apache-2.0","bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"homepage":"https://github.com/wechaty/wechaty-redux#readme","publishConfig":{"tag":"latest"},"dependencies":{"ducks":"^1.0.2","gerror":"^1.0.16","redux":"^4.1.2","redux-observable":"^2.0.0","rxjs":"^7.5","state-switch":"^1.6.3","typed-emitter":"^1.5.0-from-event","typesafe-actions":"^5.1.0","utility-types":"^3.10.0","uuid":"^8.3.2"},"peerDependencies":{"wechaty":"^1.18.1","wechaty-puppet":"^1.18.3"},"devDependencies":{"@chatie/eslint-config":"^1.0.4","@chatie/git-scripts":"^0.6.2","@chatie/semver":"^0.4.7","@chatie/tsconfig":"^4.6.3","@types/glob":"^7.2.0","@types/remote-redux-devtools":"^0.5.5","@types/uuid":"^8.3.4","glob":"^7.2.0","remote-redux-devtools":"^0.5.16","wechaty-puppet-mock":"^1.18.2"},"tap":{"check-coverage":false},"git":{"scripts":{"pre-push":"npx git-scripts-pre-push"}},"gitHead":"44deb61bdcccaef83755c80644df901cb0e12d7a","_id":"wechaty-redux@1.20.2","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-XAhSmdCDa1yaAMRYPiYqbX3BL0T1Owyf+77HxLY+450AFAyjM4xak5ZLStLWIA3zEktgzn6KwEthtu7mmZ7n3g==","shasum":"6f751974a914befd5b519caaec023d826642a6da","tarball":"https://registry.npmjs.org/wechaty-redux/-/wechaty-redux-1.20.2.tgz","fileCount":234,"unpackedSize":1226249,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE4bBTSJgOU+KdT3qwY6Nw9HR5DyFR5YFOq3uUTed1HOAiEAgiJOfZTwhEO3GWlwxPUHJHCmzLRgYhUwULZFV0bR/7k="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiX3btACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmooNw//UTCc7sNQXtmrNkyjl5P2ceCCmaXEE0jyFXGUN8hbtiFFO1v9\r\nUCj+kYMMcHjzLInca49RN2TW4jt0ZXZY/TsTYcOr34IpUJrWccPU7wynXgd3\r\nd4gkX0zxpH+C2hMQ2GCXISIwUw2792+We8m5+Tw3AQxo1VpwsoqCE9hoa8JP\r\nEfV9KXGjvGf12kjhw9pwOduCdj1G7ZR7FwT1E7f36E+H8dDuoNrozohmvq7s\r\nLI2P1XJ5l8oHpQYS79ENDS0yDbvOLw4MteLdusjbCh8e8iWla2HZFPVAWnD9\r\nTk4g9OYeX307KlefzCAnLHPIUojV7OQO7VLgdt6xse+hm9gkA4c8X7VniTB5\r\nfd2ix4+lEnBlz2WiWvruTjkK1927JhFDy0JXRqnppaGRYE3o/jGpz7nArRsP\r\ns+mJQuxL/JdRhvyOSbo1rMYeiR5VBkG9GbQz+bSc8tlQZ0OJ7xwVGgEid4X7\r\n0mtwPWq/DS3uDOeG/yQV128REtAzf88noTGBXq8B4feC30UH73zI3eI9wgxI\r\n3/Isqwp3wQHj9U+ZGjBiOVsHqlwwzdLp5PnQGdZYdbYae7H0szjcdt7iUMcD\r\nNFwZGzJ7wcJ9LY3smMSpTAYJC8MRWJsEN/VmlLjbtE/R4C9D5cIhcIi/MjR9\r\n9xvLEJVRRpq598i8AUx3NqaRI3Iavhaq2y8=\r\n=2fQr\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"zixia","email":"zixia@zixia.net"},"directories":{},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechaty-redux_1.20.2_1650423533662_0.9655741262062523"},"_hasShrinkwrap":false}},"time":{"created":"2020-06-01T19:21:28.669Z","0.1.0":"2020-06-01T19:21:28.809Z","modified":"2022-05-24T08:59:37.444Z","0.1.1":"2020-06-01T19:38:29.850Z","0.1.2":"2020-06-01T19:58:07.873Z","0.2.4":"2020-06-01T20:26:34.683Z","0.2.5":"2020-06-01T20:27:20.643Z","0.2.7":"2020-06-02T05:51:41.256Z","0.2.11":"2020-06-05T05:09:34.016Z","0.2.12":"2020-06-05T05:14:30.634Z","0.2.13":"2020-06-05T05:38:22.536Z","0.2.14":"2020-06-05T05:40:33.291Z","0.2.15":"2020-06-05T05:50:26.281Z","0.2.17":"2020-06-05T14:16:45.483Z","0.2.18":"2020-06-06T17:27:51.489Z","0.2.20":"2020-07-15T17:16:37.610Z","0.2.25":"2021-03-12T12:53:14.980Z","0.2.24":"2021-03-12T14:20:55.164Z","0.3.1":"2021-05-31T06:06:03.028Z","0.3.4":"2021-05-31T20:16:00.108Z","0.3.5":"2021-05-31T20:18:29.341Z","0.3.6":"2021-07-19T04:58:50.095Z","0.5.2":"2021-09-12T12:02:08.512Z","0.5.3":"2021-09-12T12:03:11.266Z","0.5.4":"2021-09-18T13:50:30.168Z","0.5.5":"2021-09-18T15:56:20.299Z","0.5.6":"2021-09-18T16:34:37.250Z","0.5.7":"2021-09-18T18:00:13.156Z","1.0.1":"2021-10-27T16:52:24.447Z","1.0.2":"2021-10-27T17:21:10.277Z","1.1.0":"2021-11-09T15:48:13.856Z","1.1.1":"2021-11-09T15:53:32.613Z","1.1.2":"2021-11-11T13:49:35.437Z","1.7.1":"2021-11-16T16:24:25.803Z","1.9.0":"2021-11-17T06:30:42.053Z","1.9.1":"2021-11-17T06:31:52.441Z","1.9.2":"2021-11-17T06:36:34.372Z","1.9.3":"2021-11-17T07:20:23.594Z","1.9.4":"2021-11-17T13:22:12.709Z","1.9.5":"2021-11-17T13:24:07.606Z","1.9.6":"2021-11-18T06:12:17.392Z","1.9.7":"2021-11-18T09:36:16.517Z","1.9.8":"2021-11-18T09:50:51.179Z","1.9.9":"2021-11-18T16:55:09.587Z","1.9.10":"2021-11-21T11:20:34.889Z","1.10.1":"2021-11-21T18:53:38.925Z","1.10.2":"2021-11-26T02:14:48.932Z","1.11.4":"2022-01-18T13:57:06.303Z","1.13.1":"2022-01-23T03:17:04.186Z","1.15.4":"2022-03-06T13:55:39.199Z","1.17.1":"2022-03-07T03:50:03.856Z","1.17.2":"2022-03-07T15:30:47.754Z","1.19.2":"2022-03-10T12:32:01.472Z","1.18.1":"2022-03-14T15:13:00.375Z","1.19.7":"2022-03-25T02:16:09.463Z","1.20.2":"2022-04-20T02:58:53.848Z"},"maintainers":[{"name":"zixia","email":"zixia@zixia.net"}],"description":"Wechaty Redux Plugin Powered By Ducks","homepage":"https://github.com/wechaty/wechaty-redux#readme","keywords":["wechaty","redux","ducks","plugin"],"repository":{"type":"git","url":"git+https://github.com/wechaty/wechaty-redux.git"},"author":{"name":"Huan LI","email":"zixia@zixia.net","url":"李卓桓"},"bugs":{"url":"https://github.com/wechaty/wechaty-redux/issues"},"license":"Apache-2.0","readme":"# wechaty-redux\n\n[![NPM Version](https://img.shields.io/npm/v/wechaty-redux?color=brightgreen)](https://www.npmjs.com/package/wechaty-redux)\n[![NPM](https://github.com/wechaty/wechaty-redux/workflows/NPM/badge.svg)](https://github.com/wechaty/wechaty-redux/actions?query=workflow%3ANPM)\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n[![Powered by Ducks](https://img.shields.io/badge/Powered%20by-Ducks-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--ducksify-interface)\n[![ES Modules](https://img.shields.io/badge/ES-Modules-brightgreen)](https://github.com/Chatie/tsconfig/issues/16)\n\nWrap Wechaty with Redux Actions &amp; Reducers for Easy State Management\n\n[![Wechaty Redux](docs/images/wechaty-redux.png)](https://github.com/wechaty/wechaty-redux)\n\n> Image Source: [Managing your React state with Redux](https://medium.com/the-web-tub/managing-your-react-state-with-redux-affab72de4b1)\n\n[![Downloads](https://img.shields.io/npm/dm/wechaty-redux.svg?style=flat-square)](https://www.npmjs.com/package/wechaty-redux)\n[![TypeScript](https://img.shields.io/badge/%3C%2F%3E-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n## What is Redux\n\n[Redux](https://redux.js.org) is a Predictable State Container for JS Apps\n\n## Why use Redux with Wechaty\n\nTo be write...\n\n## What is Ducks\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee [Ducks](https://github.com/huan/ducks)\n\n## Usage\n\n### Install\n\n```sh\nnpm install wechaty-redux\n```\n\n### Vanilla Redux with Wechaty Redux Plugin\n\n> Vanilla Redux means using plain Redux without any additional libraries like Ducks.\n\n```ts\nimport {\n  createStore,\n  applyMiddleware,\n}                         from 'redux'\nimport {\n  createEpicMiddleware,\n  combineEpics,\n}                         from 'redux-observable'\nimport { WechatyBuilder }  from 'wechaty'\nimport {\n  WechatyRedux,\n  Api,\n}                         from 'wechaty-redux'\n\n/**\n * 1. Configure Store with RxJS Epic Middleware for Wechaty Ducks API\n */\nconst epicMiddleware = createEpicMiddleware()\n\nconst store = createStore(\n  Api.default,\n  applyMiddleware(epicMiddleware),\n)\n\nconst rootEpic = combineEpics(...Object.values(Api.epics))\nepicMiddleware.run(rootEpic)\n\n/**\n * 2. Instanciate Wechaty and Install Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n */\nstore.subscribe(() => console.info(store.getState()))\n\nstore.dispatch(Api.actions.ding(bot.puppet.id, 'dispatch a ding action'))\n// The above code 👆 is exactly do the same thing with the following code 👇 :\nApi.operations.ding(store.dispatch)(bot.puppet.id, 'call ding from operations')\n```\n\n### Ducks Proposal Style for Wechaty Redux Plugin\n\n```ts\nimport { WechatyBuilder } from 'wechaty'\nimport { Ducks }          from 'ducks'\nimport {\n  WechatyRedux,\n  Api,\n}                   from 'wechaty-redux'\n\n/**\n * 1. Ducksify Wechaty Redux API\n */\nconst ducks = new Ducks({ wechaty: Api })\nconst store = ducks.configureStore()\n\n/**\n * 2. Instanciate Wechaty with Redux Plugin\n */\nconst bot = WechatyBuilder.build({ puppet: 'wechaty-puppet-mock' })\nbot.use(WechatyRedux({ store }))\n\n/**\n * 3. Using Redux Store with Wechaty Ducks API!\n *  (With the Power of Ducks / Ducksify)\n */\nconst wechatyDuck = ducks.ducksify('wechaty')\n\nstore.subscribe(() => console.info(store.getState()))\nwechatyDuck.operations.ding(bot.puppet.id, 'Ducksify Style ding!')\n```\n\n### Redux Actions\n\nSee: [api/actions.ts](src/api/actions.ts)\n\n### Redux Operations\n\nSee: [api/operations.ts](src/api/operations.ts)\n\n### Ducks Api\n\n[![Ducksify Extension](https://img.shields.io/badge/Redux-Ducksify-yellowgreen)](https://github.com/huan/ducks#3-ducksify-extension-currying--api-interface)\n\nSee: [api/index.ts](src/api/index.ts)\n\n## API Docs\n\n- [Paka](https://paka.dev/npm/wechaty-redux/)\n\n## Links\n\n### CQRS\n\n1. [Command–query separation](https://en.wikipedia.org/wiki/Command%E2%80%93query_separation)\n\n### Chatbot in Redux\n\n1. [Building bots with Redux](https://blog.botframework.com/2018/04/12/building-bots-with-redux/)\n1. [BotBuilder v3 Node.js bot with Redux state management](https://github.com/microsoft/BotFramework-Samples/tree/master/blog-samples/Node/Blog-Redux-Bot)\n1. [🐺 Declarative development for state driven dynamic prompt flow](https://github.com/wolf-packs/wolf-core)\n1. [Botbuilder Redux Middleware](https://github.com/howlowck/botbuilder-redux)\n1. [Botbuilder Redux Common Package](https://github.com/howlowck/botbuilder-redux-common)\n\n### Redux Tools\n\n1. [Redux DevTools](https://github.com/reduxjs/redux-devtools/tree/master/packages/redux-devtools)\n1. [Remote Redux DevTools](https://github.com/zalmoxisus/remote-redux-devtools)\n1. [Using Redux DevTools in production](https://medium.com/@zalmoxis/using-redux-devtools-in-production-4c5b56c5600f)\n1. [Video - Getting Started with Redux Dev Tools](https://egghead.io/lessons/javascript-getting-started-with-redux-dev-tools)\n\n### Redux Talks\n\n- [Dan Abramov - Live React: Hot Reloading with Time Travel at react-europe 2015](https://www.youtube.com/watch?v=xsSnOQynTHs)\n- [Dan Abramov - The Redux Journey at react-europe 2016](https://www.youtube.com/watch?v=uvAXVMwHJXU)\n- [Debugging javascript applications in production - Mihail Diordiev](https://www.youtube.com/watch?v=YU8jQ2HtqH4&feature=youtu.be)\n\n### Redux Middleware\n\n- [Redux Middleware](https://redux.js.org/advanced/middleware)\n- [React tips — How to create a Redux Middleware Throttle](https://medium.com/@leonardobrunolima/react-tips-how-to-create-a-redux-middleware-throttle-f2908ee6f49e)\n\n### Redux Enhancers\n\n- [SO: Redux enhancer example](https://stackoverflow.com/a/67119838/1123955)\n- [Creating a Store with Enhancers​](https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers)\n\n## Articles\n\n1. [Setting Up a Redux Project With Create-React-App](https://medium.com/backticks-tildes/setting-up-a-redux-project-with-create-react-app-e363ab2329b8)\n1. [Redux is half of a pattern](https://dev.to/davidkpiano/redux-is-half-of-a-pattern-1-2-1hd7)\n\n## Useful Modules\n\n1. [redux-automata - Finite state automaton for Redux.](https://github.com/mocoding-software/redux-automata)\n\n## History\n\n### main\n\n### v1.20 (Mar 7, 2022)\n\n1. Refactoring all events with breaking changes\n  for better [CQRS Wechaty](https://github.com/wechaty/cqrs) support.\n1. Refactoring the events name convension: from `eventName` to `EVENT_NAME`\n\n### v1.0 (Oct 28, 2021)\n\nRelease v1.0 of Wechaty Redux (thanks [@mukaiu](https://github.com/wechaty/redux/pull/49))\n\n### v0.5\n\n1. Upgrade RxJS version from 6 to 7.1\n1. ES Modules support\n\n### v0.2 (Jun 2, 2020)\n\nInitial version. Requires `wechaty@0.40` or above versions.\n\n1. `WechatyRedux` Plugin is ready to use.\n1. API follows the [Ducks](https://github.com/huan/ducks) specification.\n\n### v0.0.1 (Apr 19, 2020)\n\nDecide to build a Redux Plugin for Wechaty.\n\nRelated Projects:\n\n1. [A library that exposes matrix-js-sdk state via Redux](https://github.com/lukebarnard1/matrix-redux-wrap)\n1. [A library for managing network state in Redux](https://github.com/amplitude/redux-query)\n1. [How to setup Redux for a REST api](https://medium.com/hackernoon/state-management-with-redux-50f3ec10c10a)\n1. [Redux middleware for calling an API](https://github.com/agraboso/redux-api-middleware)\n\n## Author\n\n[Huan LI](https://github.com/huan) ([李卓桓](http://linkedin.com/in/zixia)) zixia@zixia.net\n\n[![Profile of Huan LI (李卓桓) on StackOverflow](https://stackexchange.com/users/flair/265499.png)](https://stackexchange.com/users/265499)\n\n## Copyright & License\n\n- Code & Docs © 2020 Huan (李卓桓) \\<zixia@zixia.net\\>\n- Code released under the Apache-2.0 License\n- Docs released under Creative Commons\n","readmeFilename":"README.md"}