{"id":23790027,"url":"https://github.com/blackglory/return-style","last_synced_at":"2026-04-30T11:37:53.464Z","repository":{"id":44965027,"uuid":"211466440","full_name":"BlackGlory/return-style","owner":"BlackGlory","description":"🌲 Convert the result of any function or promise to the user's desired style.","archived":false,"fork":false,"pushed_at":"2023-06-11T06:20:36.000Z","size":1700,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-25T18:54:56.783Z","etag":null,"topics":["browser","esm","library","nodejs","npm-package","typescript"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/return-style","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/BlackGlory.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-09-28T08:06:45.000Z","updated_at":"2023-01-21T14:33:13.000Z","dependencies_parsed_at":"2024-06-20T19:05:48.885Z","dependency_job_id":"ba9479ff-a235-45d1-bd48-fd63ee7d14c4","html_url":"https://github.com/BlackGlory/return-style","commit_stats":{"total_commits":159,"total_committers":2,"mean_commits":79.5,"dds":0.08176100628930816,"last_synced_commit":"1f61b2c0dac3b17da8a5dd588533e2f0a06e1305"},"previous_names":[],"tags_count":44,"template":false,"template_full_name":null,"purl":"pkg:github/BlackGlory/return-style","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlackGlory%2Freturn-style","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlackGlory%2Freturn-style/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlackGlory%2Freturn-style/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlackGlory%2Freturn-style/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BlackGlory","download_url":"https://codeload.github.com/BlackGlory/return-style/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlackGlory%2Freturn-style/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260987955,"owners_count":23093411,"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":["browser","esm","library","nodejs","npm-package","typescript"],"created_at":"2025-01-01T17:18:10.247Z","updated_at":"2026-04-30T11:37:48.441Z","avatar_url":"https://github.com/BlackGlory.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# return-style\nNon-intrusively convert the result of any function or promise to the user's desired style.\n\n## Install\n```sh\nnpm install --save return-style\n# or\nyarn add return-style\n```\n\n## API\nAll functions whose names are suffixed with `Async` can handle synchronous errors.\nIf you only need to catch asynchronous errors, use functions with the suffix `Promise`.\n\n### isSuccess\n```ts\nfunction isSuccess(fn: () =\u003e unknown): boolean\nfunction isSuccessAsync(fn: () =\u003e Awaitable\u003cunknown\u003e): Promise\u003cboolean\u003e\nfunction isSuccessPromise(promise: PromiseLike\u003cunknown\u003e): Promise\u003cboolean\u003e\n```\n\nReturn true when returning, false when throwing.\n\n```ts\nif (isSuccess(() =\u003e fn())) {\n  ...\n}\n\nif (await isSuccessAsync(() =\u003e asyncFn())) {\n  ...\n}\n\nif (await isSuccessPromise(promise)) {\n  ...\n}\n```\n\n### isFailure\n```ts\nfunction isFailure(fn: () =\u003e unknown): boolean\nfunction isFailureAsync(fn: () =\u003e Awaitable\u003cunknown\u003e): Promise\u003cboolean\u003e\nfunction isFailurePromise(promise: PromiseLike\u003cunknown\u003e): Promise\u003cboolean\u003e\n```\n\nReturn true when throwing, true when returning.\n\n```ts\nif (isFailure(() =\u003e fn())) {\n  ...\n}\n\nif (await isFailureAsync(() =\u003e asyncFn())) {\n  ...\n}\n\nif (await isFailurePromise(promise)) {\n  ...\n}\n```\n\n### getResult\n```ts\nfunction getResult\u003cT\u003e(fn: () =\u003e T): T | undefined\nfunction getResultAsync\u003cT\u003e(fn: () =\u003e Awaitable\u003cT\u003e): Promise\u003cT | undefined\u003e\nfunction getResultPromise\u003cT\u003e(promise: PromiseLike\u003cT\u003e): Promise\u003cT | undefined\u003e\n```\n\n```js\nconst result = getResult(() =\u003e fn())\nif (result) {\n  ...\n}\n\nconst result = await getResultAsync(() =\u003e asyncFn())\nif (result) {\n  ...\n}\n\nconst result = await getResultPromise(promise)\nif (result) {\n  ...\n}\n```\n\n### getError\n```ts\nfunction getError\u003cE\u003e(fn: () =\u003e unknown): E | undefined\nfunction getErrorAsync\u003cE\u003e(fn: () =\u003e Awaitable\u003cunknown\u003e): Promise\u003cE | undefined\u003e\nfunction getErrorPromise\u003cE\u003e(promise: PromiseLike\u003cunknown\u003e): Promise\u003cE | undefined\u003e\nfunction getErrorAsyncIterable\u003cE\u003e(iterable: AsyncIterable\u003cunknown\u003e): Promise\u003cE | undefined\u003e\n```\n\nDesigned for testing, helping to achieve Arrange-Act-Assert pattern.\n\n```js\n// BAD: try...catch\ntest('divided by zero', () =\u003e {\n  expect.hasAssertions()\n\n  const calc = createCalculator()\n\n  try {\n    calc.eval('1 / 0')\n  } catch (err) {\n    expect(err).toInstanceOf(Error)\n  }\n})\n\n// BAD: toThrow\ntest('divided by zero', () =\u003e {\n  const calc = createCalculator()\n\n  expect(() =\u003e calc.eval('1 / 0')).toThrow(Error)\n})\n\n// GOOD: Arrange, Act, Assert\ntest('divided by zero', () =\u003e {\n  const calc = createCalculator()\n\n  const err = getError(() =\u003e calc.eval('1 / 0'))\n\n  expect(err).toInstanceOf(Error)\n})\n```\n\n### Tuple / Go-like\nSince modern JavaScript does not advocate repeated declarations of variables (`var`), this style can sometimes be difficult to use.\n\n#### [Error, Result]\n```ts\nfunction getErrorResult\u003cE = Error, T = unknown\u003e(fn: () =\u003e T): [undefined, T] | [E, undefined]\nfunction getErrorResultAsync\u003cE = Error, T = unknown\u003e(fn: () =\u003e Awaitable\u003cT\u003e): Promise\u003c[undefined, T] | [E, undefined]\u003e\nfunction getErrorResultPromise\u003cE = Error, T = unknown\u003e(promise: PromiseLike\u003cT\u003e): Promise\u003c[undefined, T] | [E, undefined]\u003e\n\n```\n\nReturn tuple (Error, Result).\n\n```ts\nconst [err, ret] = getErrorResult(() =\u003e fn())\nconst [err] = getErrorResult(() =\u003e fn())\n\nconst [err, ret] = await getErrorResultAsync(() =\u003e fnAsync())\nconst [err] = await getErrorResultAsync(() =\u003e fnAsync())\n\nconst [err, ret] = await getErrorResultAsync(promise)\nconst [err] = await getErrorResultAsync(promise)\n```\n\n#### [Result, Error]\n```ts\nfunction getResultError\u003cE = Error, T = unknown\u003e(fn: () =\u003e T): [T, undefined] | [undefined, E]\nfunction getResultErrorAsync\u003cE = Error, T = unknown\u003e(fn: () =\u003e Awaitable\u003cT\u003e): Promise\u003c[T, undefined] | [undefined, E]\u003e\nfunction getResultErrorPromise\u003cE = Error, T = unknown\u003e(promise: PromiseLike\u003cT\u003e): Promise\u003c[T, undefined] | [undefined, E]\u003e\n```\n\nReturn tuple (Result, Error).\n\n```ts\nconst [ret, err] = getResultError(() =\u003e fn())\nconst [ret] = getResultError(() =\u003e fn())\n\nconst [ret, err] = await getResultErrorAsync(() =\u003e fn())\nconst [ret] = await getResultErrorAsync(() =\u003e fn())\n\nconst [ret, err] = await getResultErrorPromise(promise)\nconst [ret] = await getResultErrorPromise(promise)\n```\n\n#### [isSuccess, Result | undefined]\n```ts\nfunction getSuccess\u003cT\u003e(fn: () =\u003e T): [true, T] | [false, undefined]\nfunction getSuccessAsync\u003cT\u003e(fn: () =\u003e Awaitable\u003cT\u003e): Promise\u003c[true, T] | [false, undefined]\u003e\nfunction getSuccessPromise\u003cT\u003e(promise: PromiseLike\u003cT\u003e): Promise\u003c[true, T] | [false, undefined]\u003e\n```\n\nReturn tuple (isSuccess, Result | undefined)\n\n```ts\nconst [succ, ret] = getSuccess(() =\u003e fn())\n\nconst [succ, ret] = await getSuccessAsync(() =\u003e asyncFn())\n\nconst [succ, ret] = await getSuccessPromise(promise)\n```\n\n#### [isFailure, Error | undefined]\n```ts\nfunction getFailure\u003cE = Error\u003e(fn: () =\u003e unknown): [true, E] | [false, undefined]\nfunction getFailureAsync\u003cE = Error\u003e(fn: () =\u003e Awaitable\u003cunknown\u003e): Promise\u003c[true, E] | [false, undefined]\u003e\nfunction getFailurePromise\u003cE = Error\u003e(promise: PromiseLike\u003cunknown\u003e): Promise\u003c[true, E] | [false, undefined]\u003e\n```\n\nReturn tuple (isFailure, Error | undefined)\n\n```ts\nconst [fail, ret] = getFailure(() =\u003e fn())\n\nconst [fail, ret] = await getFailureAsync(() =\u003e asyncFn())\n\nconst [fail, ret] = await getFailurePromise(promise)\n```\n\n### ADT / Rust-like / Haskell-like\n#### Result\u003cT, E\u003e = Ok\u003cT\u003e | Err\u003cE\u003e\n```ts\nfunction toResult\u003cE = Error, T = unknown\u003e(fn: () =\u003e T): Result\u003cT, E\u003e\nfunction toResultAsync\u003cE = Error, T = unknown\u003e(fn: () =\u003e Awaitable\u003cT\u003e): Promise\u003cResult\u003cT, E\u003e\u003e\nfunction toResultPromise\u003cE = Error, T = unknown\u003e(promise: PromiseLike\u003cT\u003e): Promise\u003cResult\u003cT, E\u003e\u003e\n```\n\n`Result` is designed according to Rust's enumeration of the same name,\nplease refer to the relevant documentation.\n\n```ts\nclass Result\u003cT, E\u003e {\n  static Ok(val: T) =\u003e Result\u003cT, E\u003e\n  static Err(err: E) =\u003e Result\u003cnever, E\u003e\n\n  isOk(): boolean\n  isErr(): boolean\n\n  map\u003cU\u003e(mapper: (val: T) =\u003e U): Result\u003cU, E\u003e\n  mapOr\u003cU\u003e(defaultValue: U, mapper: (val: T) =\u003e U): Result\u003cU, E\u003e\n  mapOrElse\u003cU\u003e(createDefaultValue: (err: E) =\u003e U, mapper: (val: T) =\u003e U): Result\u003cU, E\u003e\n  mapErr\u003cU\u003e(mapper: (err: E) =\u003e U): Result\u003cT, U\u003e\n\n  /**\n   * @throws {E}\n   */\n  unwrap(): T\n\n  unwrapOr\u003cU\u003e(defaultValue: U): T | U\n  unwrapOrElse\u003cU\u003e(createDefaultValue: (err: E) =\u003e U): T | U\n\n  /**\n   * @throws {Error}\n   */\n  unwrapErr(): E\n\n  /**\n   * @throws {Error}\n   */\n  expect(message: string): T\n\n  /**\n   * @throws {Error}\n   */\n  expectErr(message: string): E\n\n  ok(): Option\u003cT\u003e\n  err(): Option\u003cE\u003e\n}\n```\n\n#### Option\u003cT\u003e = Some\u003cT\u003e | None\n```ts\nfunction toOption\u003cT\u003e(fn: () =\u003e T): Option\u003cT\u003e\nfunction toOptionAsync\u003cT\u003e(fn: () =\u003e Awaitable\u003cT\u003e): Promise\u003cOption\u003cT\u003e\u003e\nfunction toOptionPromise\u003cT\u003e(promise: PromiseLike\u003cT\u003e): Promise\u003cOption\u003cT\u003e\u003e\n```\n\n`Option` is designed according to Rust's enumeration of the same name,\nplease refer to the relevant documentation.\n\n```ts\nclass Option\u003cT\u003e {\n  static Some\u003cT\u003e(val: T) =\u003e Option\u003cT\u003e\n  static None\u003cT\u003e() =\u003e Option\u003cT\u003e\n\n  isSome(): boolean\n  isNone(): boolean\n\n  map\u003cU\u003e(mapper: (val: T) =\u003e U): Option\u003cU\u003e\n  mapOr\u003cU\u003e(defaultValue: U, mapper: (val: T) =\u003e U): Option\u003cU\u003e\n  mapOrElse\u003cU\u003e(createDefaultValue: () =\u003e U, mapper: (val: T) =\u003e U): Option\u003cU\u003e\n\n  filter\u003cU extends T = T\u003e(predicate: (val: T) =\u003e boolean): Option\u003cU\u003e\n\n  /**\n   * @throws {Error}\n   */\n  unwrap(): T\n\n  unwrapOr\u003cU\u003e(defaultValue: U): T | U\n  unwrapOrElse\u003cU\u003e(createDefaultValue: () =\u003e U): T | U\n\n  /**\n   * @throws {Error}\n   */\n  expect(message: string): T\n\n  okOr\u003cE\u003e(err: E): Result\u003cT, E\u003e\n  okOrElse\u003cE\u003e(createErr: () =\u003e E): Result\u003cT, E\u003e\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblackglory%2Freturn-style","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fblackglory%2Freturn-style","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblackglory%2Freturn-style/lists"}