{"id":17659387,"url":"https://github.com/m0a/typescript-fsa-redux-observable","last_synced_at":"2025-05-05T21:43:27.188Z","repository":{"id":63253920,"uuid":"99648988","full_name":"m0a/typescript-fsa-redux-observable","owner":"m0a","description":"TypeScript FSA utilities for redux-observable","archived":false,"fork":false,"pushed_at":"2020-07-11T08:15:12.000Z","size":125,"stargazers_count":28,"open_issues_count":5,"forks_count":6,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-04-26T16:14:39.501Z","etag":null,"topics":["redux","redux-observable","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/m0a.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-08-08T04:09:32.000Z","updated_at":"2021-03-18T08:05:33.000Z","dependencies_parsed_at":"2022-11-15T21:31:43.516Z","dependency_job_id":null,"html_url":"https://github.com/m0a/typescript-fsa-redux-observable","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m0a%2Ftypescript-fsa-redux-observable","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m0a%2Ftypescript-fsa-redux-observable/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m0a%2Ftypescript-fsa-redux-observable/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m0a%2Ftypescript-fsa-redux-observable/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/m0a","download_url":"https://codeload.github.com/m0a/typescript-fsa-redux-observable/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252284932,"owners_count":21723671,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["redux","redux-observable","typescript"],"created_at":"2024-10-23T16:06:53.983Z","updated_at":"2025-05-05T21:43:27.169Z","avatar_url":"https://github.com/m0a.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# [TypeScript FSA](https://github.com/aikoven/typescript-fsa) utilities for redux-observable \n\n[![npm version](https://badge.fury.io/js/typescript-fsa-redux-observable.svg)](https://badge.fury.io/js/typescript-fsa-redux-observable)\n[![Build Status](https://travis-ci.org/m0a/typescript-fsa-redux-observable.svg?branch=master)](https://travis-ci.org/m0a/typescript-fsa-redux-observable)\n \n## Installation\n\n```\nyarn add typescript-fsa-redux-observable\n```\n\n\n## API\n\n### ofAction(action: ActionCreator)\n\n**Example:**\n\n```ts\n\n\n// for actions\nimport actionCreatorFactory, { AnyAction, Action, Success } from 'typescript-fsa';\n\n// for reducers\nimport { reducerWithInitialState } from 'typescript-fsa-reducers';\nimport { combineReducers } from 'redux';\n\n//for epics\nimport { delay, map, tap, ignoreElements } from 'rxjs/operators';\nimport { ofAction, ofActionPayload } from 'typescript-fsa-redux-observable'; // \u003c-- here\nimport { combineEpics, Epic, createEpicMiddleware } from 'redux-observable';\n\n//reducer\nimport {createStore, applyMiddleware} from 'redux';\n\n\n// action\nconst actionCreator = actionCreatorFactory();\nconst actions = {\n    increment: actionCreator.async\u003cundefined, undefined\u003e('INCREMENT'),\n    decrement: actionCreator.async\u003cundefined, undefined\u003e('DECREMENT')\n};\n\n// reducers \u0026 state\n\ninterface State {\n    counter: number;\n}\n\nconst counter = reducerWithInitialState(0)\n    .case(actions.increment.done, state =\u003e state + 1)\n    .case(actions.decrement.done, state =\u003e state - 1);\nconst rootReducer = combineReducers({\n    counter\n});\n\n// epics\nconst counterIncrementEpic: Epic\u003cAnyAction, Action\u003cSuccess\u003cundefined, undefined\u003e\u003e, State\u003e =\n    action$ =\u003e\n        action$.pipe(\n            ofActionPayload(actions.increment.started),\n            delay(300),\n            map(payload =\u003e actions.increment.done({\n                params: payload,\n                result: undefined\n            }))\n        );\n\nconst counterDecrementEpic: Epic\u003cAnyAction, Action\u003cSuccess\u003cundefined, undefined\u003e\u003e, State\u003e =\n    action$ =\u003e\n        action$.pipe(\n            ofActionPayload(actions.decrement.started),\n            delay(300),\n            map(payload =\u003e actions.decrement.done({\n                params: payload,\n                result: undefined\n            }))\n        );\n\nconst loggingEpic: Epic\u003cAnyAction, AnyAction, State\u003e =\n    action$ =\u003e\n        action$.pipe(\n            ofAction(\n                actions.decrement.started,\n                actions.increment.started,\n            ),\n            tap(action =\u003e console.log(action.type)),\n            ignoreElements()\n        );\n\n\nconst rootEpic = combineEpics(\n    counterIncrementEpic,\n    counterDecrementEpic,\n    loggingEpic,\n);\n\nconst epicMiddleware = createEpicMiddleware\u003cAnyAction, AnyAction, State\u003e();\nconst store = createStore(rootReducer, applyMiddleware(epicMiddleware));\nepicMiddleware.run(rootEpic);\n\n// tool\nasync function sleep(time: number) {\n    return new Promise\u003cvoid\u003e(resolve =\u003e {\n        setTimeout(() =\u003e (resolve()), time)\n    })\n}\n\nit(\"increment decrement test\", async () =\u003e {\n    expect(store.getState()).toEqual({ counter: 0 });\n\n    store.dispatch(actions.increment.started(undefined));\n    expect(store.getState()).toEqual({ counter: 0 });\n\n    await sleep(300);\n    expect(store.getState()).toEqual({ counter: 1 });\n\n    store.dispatch(actions.decrement.started(undefined));\n    expect(store.getState()).toEqual({ counter: 1 });\n\n    await sleep(300);\n    expect(store.getState()).toEqual({ counter: 0 })\n});\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fm0a%2Ftypescript-fsa-redux-observable","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fm0a%2Ftypescript-fsa-redux-observable","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fm0a%2Ftypescript-fsa-redux-observable/lists"}