{"id":13816538,"url":"https://github.com/aikoven/typescript-fsa","last_synced_at":"2025-04-08T00:37:53.598Z","repository":{"id":57150132,"uuid":"70559851","full_name":"aikoven/typescript-fsa","owner":"aikoven","description":"Type-safe action creator utilities","archived":false,"fork":false,"pushed_at":"2020-05-28T17:37:16.000Z","size":139,"stargazers_count":608,"open_issues_count":9,"forks_count":28,"subscribers_count":9,"default_branch":"master","last_synced_at":"2024-10-29T17:39:02.344Z","etag":null,"topics":["action-creator","flux","fsa","redux","typescript"],"latest_commit_sha":null,"homepage":null,"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/aikoven.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-10-11T05:41:06.000Z","updated_at":"2024-10-25T15:43:02.000Z","dependencies_parsed_at":"2022-08-29T10:52:48.058Z","dependency_job_id":null,"html_url":"https://github.com/aikoven/typescript-fsa","commit_stats":null,"previous_names":["aikoven/redux-typescript-actions"],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aikoven%2Ftypescript-fsa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aikoven%2Ftypescript-fsa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aikoven%2Ftypescript-fsa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aikoven%2Ftypescript-fsa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aikoven","download_url":"https://codeload.github.com/aikoven/typescript-fsa/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247755560,"owners_count":20990620,"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":["action-creator","flux","fsa","redux","typescript"],"created_at":"2024-08-04T05:00:45.160Z","updated_at":"2025-04-08T00:37:53.577Z","avatar_url":"https://github.com/aikoven.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"# TypeScript FSA [![npm version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url]\n\nAction Creator library for TypeScript. Its goal is to provide type-safe experience with Flux actions with minimum boilerplate.\nCreated actions are FSA-compliant:\n\n```ts\ninterface Action\u003cPayload\u003e {\n  type: string;\n  payload: Payload;\n  error?: boolean;\n  meta?: Object;\n}\n```\n\n## Installation\n\n```\nnpm install --save typescript-fsa\n```\n\n## Usage\n\n### Basic\n\n```ts\nimport actionCreatorFactory from 'typescript-fsa';\n\nconst actionCreator = actionCreatorFactory();\n\n// Specify payload shape as generic type argument.\nconst somethingHappened = actionCreator\u003c{foo: string}\u003e('SOMETHING_HAPPENED');\n\n// Get action creator type.\nconsole.log(somethingHappened.type);  // SOMETHING_HAPPENED\n\n// Create action.\nconst action = somethingHappened({foo: 'bar'});\nconsole.log(action);  // {type: 'SOMETHING_HAPPENED', payload: {foo: 'bar'}}\n```\n\n### Async Action Creators\n\nAsync Action Creators are objects with properties `started`, `done` and\n`failed` whose values are action creators. There is a number of [Companion Packages](#companion-packages) that help with binding Async Action Creators to async processes.\n\n```ts\nimport actionCreatorFactory from 'typescript-fsa';\n\nconst actionCreator = actionCreatorFactory();\n\n// specify parameters and result shapes as generic type arguments\nconst doSomething =\n  actionCreator.async\u003c{foo: string},   // parameter type\n                      {bar: number},   // success type\n                      {code: number}   // error type\n                     \u003e('DO_SOMETHING');\n\nconsole.log(doSomething.started({foo: 'lol'}));\n// {type: 'DO_SOMETHING_STARTED', payload: {foo: 'lol'}}\n\nconsole.log(doSomething.done({\n  params: {foo: 'lol'},\n  result: {bar: 42},\n}));\n// {type: 'DO_SOMETHING_DONE', payload: {\n//   params: {foo: 'lol'},\n//   result: {bar: 42},\n// }}\n\nconsole.log(doSomething.failed({\n  params: {foo: 'lol'},\n  error: {code: 42},\n}));\n// {type: 'DO_SOMETHING_FAILED', payload: {\n//   params: {foo: 'lol'},\n//   error: {code: 42},\n// }, error: true}\n```\n\n### Actions With Type Prefix\n\nYou can specify a prefix that will be prepended to all action types. This is\nuseful to namespace library actions as well as for large projects where it's\nconvenient to keep actions near the component that dispatches them.\n\n```ts\n// MyComponent.actions.ts\nimport actionCreatorFactory from 'typescript-fsa';\n\nconst actionCreator = actionCreatorFactory('MyComponent');\n\nconst somethingHappened = actionCreator\u003c{foo: string}\u003e('SOMETHING_HAPPENED');\n\nconst action = somethingHappened({foo: 'bar'});\nconsole.log(action);\n// {type: 'MyComponent/SOMETHING_HAPPENED', payload: {foo: 'bar'}}\n```\n\n### Redux\n\n```ts\n// actions.ts\nimport actionCreatorFactory from 'typescript-fsa';\n\nconst actionCreator = actionCreatorFactory();\n\nexport const somethingHappened =\n  actionCreator\u003c{foo: string}\u003e('SOMETHING_HAPPENED');\nexport const somethingAsync =\n  actionCreator.async\u003c{foo: string},\n                      {bar: string}\n                     \u003e('SOMETHING_ASYNC');\n\n\n// reducer.ts\nimport {Action} from 'redux';\nimport {isType} from 'typescript-fsa';\nimport {somethingHappened, somethingAsync} from './actions';\n\ntype State = {bar: string};\n\nexport const reducer = (state: State, action: Action): State =\u003e {\n  if (isType(action, somethingHappened)) {\n    // action.payload is inferred as {foo: string};\n\n    action.payload.bar;  // error\n\n    return {bar: action.payload.foo};\n  }\n\n  if (isType(action, somethingAsync.started)) {\n    return {bar: action.payload.foo};\n  }\n\n  if (isType(action, somethingAsync.done)) {\n    return {bar: action.payload.result.bar};\n  }\n\n  return state;\n};\n```\n\n#### redux-observable\n\n```ts\n// epic.ts\nimport {Action} from 'redux';\nimport {Observable} from 'rxjs';\nimport {somethingAsync} from './actions';\n\nexport const epic = (actions$: Observable\u003cAction\u003e) =\u003e\n  actions$.filter(somethingAsync.started.match)\n    .delay(2000)\n    .map(action =\u003e {\n      // action.payload is inferred as {foo: string};\n\n      action.payload.bar;  // error\n\n      return somethingAsync.done({\n        params: action.payload,\n        result: {\n          bar: 'bar',\n        },\n      });\n    });\n```\n\n## Companion Packages\n\n* [typescript-fsa-redux-saga](https://github.com/aikoven/typescript-fsa-redux-saga)\n* [typescript-fsa-redux-observable](https://github.com/m0a/typescript-fsa-redux-observable)\n* [typescript-fsa-redux-thunk](https://github.com/xdave/typescript-fsa-redux-thunk)\n* [typescript-fsa-reducers](https://github.com/dphilipson/typescript-fsa-reducers)\n\n## Resources\n\n* [Type-safe Flux Standard Actions (FSA) in React Using TypeScript FSA](https://www.triplet.fi/blog/type-safe-flux-standard-actions-fsa-in-react-using-typescript-fsa/)\n* [Type-safe Asynchronous Actions (Redux Thunk) Using TypeScript FSA](https://www.triplet.fi/blog/type-safe-asynchronous-actions-redux-thunk-using-typescript-fsa/)\n\n## API\n\n### `actionCreatorFactory(prefix?: string, defaultIsError?: Predicate): ActionCreatorFactory`\n\nCreates Action Creator factory with optional prefix for action types.\n\n* `prefix?: string`: Prefix to be prepended to action types as `\u003cprefix\u003e/\u003ctype\u003e`.\n* `defaultIsError?: Predicate`: Function that detects whether action is error\n given the payload. Default is `payload =\u003e payload instanceof Error`.\n\n### `ActionCreatorFactory\u003cPayload\u003e#(type: string, commonMeta?: object, isError?: boolean): ActionCreator\u003cPayload\u003e`\n\nCreates Action Creator that produces actions with given `type` and payload of type `Payload`.\n\n* `type: string`: Type of created actions.\n* `commonMeta?: object`: Metadata added to created actions.\n* `isError?: boolean`: Defines whether created actions are error actions.\n\n### `ActionCreatorFactory#async\u003cParams, Result, Error\u003e(type: string, commonMeta?: object): AsyncActionCreators\u003cParams, Result, Error\u003e`\n\nCreates three Action Creators:\n* `started: ActionCreator\u003cParams\u003e`\n* `done: ActionCreator\u003c{params: Params, result: Result}\u003e`\n* `failed: ActionCreator\u003c{params: Params, error: Error}\u003e`\n\nUseful to wrap asynchronous processes.\n\n* `type: string`: Prefix for types of created actions, which will have types `${type}_STARTED`, `${type}_DONE` and `${type}_FAILED`.\n* `commonMeta?: object`: Metadata added to created actions.\n\n### `ActionCreator\u003cPayload\u003e#(payload: Payload, meta?: object): Action\u003cPayload\u003e`\n\nCreates action with given payload and metadata.\n\n* `payload: Payload`: Action payload.\n* `meta?: object`: Action metadata. Merged with `commonMeta` of Action Creator.\n\n### `isType(action: Action, actionCreator: ActionCreator): boolean`\n\nReturns `true` if action has the same type as action creator. Defines\n[Type Guard](https://www.typescriptlang.org/docs/handbook/advanced-types.html#user-defined-type-guards)\nthat lets TypeScript know `payload` type inside blocks where `isType` returned\n`true`:\n\n```ts\nconst somethingHappened = actionCreator\u003c{foo: string}\u003e('SOMETHING_HAPPENED');\n\nif (isType(action, somethingHappened)) {\n  // action.payload has type {foo: string}\n}\n```\n\n### `ActionCreator#match(action: Action): boolean`\n\nIdentical to `isType` except it is exposed as a bound method of an action\ncreator. Since it is bound and takes a single argument it is ideal for passing\nto a filtering function like `Array.prototype.filter` or\n[RxJS](http://reactivex.io/rxjs/)'s `Observable.prototype.filter`.\n\n```ts\nconst somethingHappened = actionCreator\u003c{foo: string}\u003e('SOMETHING_HAPPENED');\nconst somethingElseHappened =\n  actionCreator\u003c{bar: number}\u003e('SOMETHING_ELSE_HAPPENED');\n\nif (somethingHappened.match(action)) {\n  // action.payload has type {foo: string}\n}\n\nconst actionArray = [\n  somethingHappened({foo: 'foo'}),\n  somethingElseHappened({bar: 5}),\n];\n\n// somethingHappenedArray has inferred type Action\u003c{foo: string}\u003e[]\nconst somethingHappenedArray = actionArray.filter(somethingHappened.match);\n```\n\nFor more on using `Array.prototype.filter` as a type guard, see\n[this github issue](https://github.com/Microsoft/TypeScript/issues/7657).\n\n\n[npm-image]: https://badge.fury.io/js/typescript-fsa.svg\n[npm-url]: https://badge.fury.io/js/typescript-fsa\n[travis-image]: https://travis-ci.org/aikoven/typescript-fsa.svg?branch=master\n[travis-url]: https://travis-ci.org/aikoven/typescript-fsa\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faikoven%2Ftypescript-fsa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faikoven%2Ftypescript-fsa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faikoven%2Ftypescript-fsa/lists"}