diff --git a/package.json b/package.json index 7936423..63a176a 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "lambda-res", "description": "Type-safe error handling without exception", "keywords": ["aws", "serverless", "lambda", "error", "error-handling"], - "version": "1.0.18", + "version": "1.0.19", "author": "Alex Shelkovskiy ", "repository": "https://github.com/alexshelkov/result", "license": "MIT", diff --git a/src/__tests__/cast.ts b/src/__tests__/cast.ts index 3384eb4..11028f8 100644 --- a/src/__tests__/cast.ts +++ b/src/__tests__/cast.ts @@ -5,11 +5,11 @@ describe('to result', () => { expect.assertions(2); expect(() => { - return toResult(null); + toResult(null); }).toThrow('Unexpected input'); expect(() => { - return toResult('123'); + toResult('123'); }).toThrow('Unexpected input'); }); @@ -17,7 +17,7 @@ describe('to result', () => { expect.assertions(1); expect(() => { - return toResult({ data: 1 }); + toResult({ data: 1 }); }).toThrow('Unexpected input'); }); diff --git a/src/__tests__/util.ts b/src/__tests__/util.ts index a85144d..f249d68 100644 --- a/src/__tests__/util.ts +++ b/src/__tests__/util.ts @@ -1,4 +1,4 @@ -import { Err, Result, ok, fail, err, compare, nope } from '../index'; +import { Err, Result, ok, fail, throwFail, err, compare, nope } from '../index'; describe('util', () => { it('works with skip option', () => { @@ -66,11 +66,33 @@ describe('util', () => { }).toThrow('Unknown status'); }); + it('throw fail', () => { + expect.assertions(2); + + expect(() => { + throwFail('Thrown'); + }).toThrow('Thrown'); + + expect(() => { + const a: string | undefined = Math.random() === -1 ? 'never' : undefined; + + if (!a) { + throwFail('Thrown'); + } + + // undefined is removed because + // throwFail returns never + const b: string = a; + + expect(b).toStrictEqual('never'); + }).toThrow('Thrown'); + }); + it('never will throw exception if called', () => { expect.assertions(1); expect(() => { - return nope(undefined as never); + nope(undefined as never); }).toThrow('Unreachable'); }); }); diff --git a/src/index.ts b/src/index.ts index 2cc37cd..3786ecc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,19 +2,18 @@ export { ErrUtil as Err, Err as ErrInfo, ErrLevel, Errs } from './err'; export { Success, Failure, Result, Response } from './result'; -export { - isErr, - isErrType, - isSuccessLike, - isFailureLike -} from './checks' +export { isErr, isErrType, isSuccessLike, isFailureLike } from './checks'; export { ok, fail, + throwFail, err, compare, nope, toResult, FailureException, + OkFn, + FailFn, + ThrowFailFn, } from './utils'; diff --git a/src/result.ts b/src/result.ts index 297a985..358d9ff 100644 --- a/src/result.ts +++ b/src/result.ts @@ -77,14 +77,6 @@ export interface Failure extends PartialFailure { onOk(): never; - // onFail, Res2 extends Response, Res extends Res1 | Res2, Data = never, Fail2 = never>( - // this: Result, - // cb: ( - // err: Fail, - // result: Result - // ) => Res - // ): Res extends Response ? Transform : Result; - onFail( this: Result, cb: (err: Fail, result: Result) => Result @@ -95,17 +87,6 @@ export interface Failure extends PartialFailure { cb: (err: Fail, result: Result) => Response ): Transform; - // onErr< - // Type extends string, - // Res extends ({ type: Type } | Type) | Promise<{ type: Type } | Type>, - // Data = never - // >( - // this: Result, - // cb: (err: Fail, result: Result) => Res - // ): Res extends Promise - // ? Transform> - // : Result>; - onErr( this: Result, cb: (err: Fail, result: Result) => Res diff --git a/src/utils.ts b/src/utils.ts index cb54f7c..8e2079f 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -316,7 +316,9 @@ type OkMessage = { skip?: boolean; }; -export const ok = ( +export type OkFn = (data: Data, params?: OkMessage) => Success; + +export const ok: OkFn = ( data: Data, { code, order, skip }: OkMessage = {} ): Success => { @@ -372,7 +374,12 @@ export const err = ( type ErrorMessage = FailMessage & Omit; -export const fail = ( +export type FailFn = ( + type: Fail extends Err ? Fail['type'] : undefined, + params?: ErrorMessage +) => Failure; + +export const fail: FailFn = ( type: Fail extends Err ? Fail['type'] : undefined, { message, code, order, skip, ...error }: ErrorMessage = {} as ErrorMessage ): Failure => { @@ -385,6 +392,18 @@ export const fail = ( return err(failure, { message, code, order, skip }); }; +export type ThrowFailFn = ( + type: Fail extends Err ? Fail['type'] : undefined, + params?: ErrorMessage +) => never; + +export const throwFail: ThrowFailFn = ( + type: Fail extends Err ? Fail['type'] : undefined, + params: ErrorMessage = {} as ErrorMessage +): never => { + throw fail(type, params); +}; + export const compare = ( r1: Result, r2: Result