@whatwg-node/promise-helpers
Advanced tools
Comparing version
@@ -15,19 +15,27 @@ "use strict"; | ||
} | ||
function handleMaybePromise(inputFactory, outputSuccessFactory, outputErrorFactory) { | ||
function _handleMaybePromise() { | ||
const input$ = inputFactory(); | ||
if (isPromise(input$)) { | ||
return input$.then(outputSuccessFactory, outputErrorFactory); | ||
} | ||
return outputSuccessFactory(input$); | ||
function handleMaybePromise(inputFactory, outputSuccessFactory, outputErrorFactory, finallyFactory) { | ||
let input$; | ||
try { | ||
input$ = fakePromise(inputFactory()); | ||
} | ||
if (!outputErrorFactory) { | ||
return _handleMaybePromise(); | ||
catch (err) { | ||
input$ = fakeRejectPromise(err); | ||
} | ||
let result$; | ||
try { | ||
return _handleMaybePromise(); | ||
result$ = input$.then(outputSuccessFactory, outputErrorFactory); | ||
} | ||
catch (err) { | ||
return outputErrorFactory(err); | ||
result$ = fakeRejectPromise(err); | ||
} | ||
if (finallyFactory) { | ||
result$ = promiseLikeFinally(result$, finallyFactory); | ||
} | ||
if (isFakePromise(result$)) { | ||
return result$.__fakePromiseValue; | ||
} | ||
if (isFakeRejectPromise(result$)) { | ||
throw result$.__fakeRejectError; | ||
} | ||
return result$; | ||
} | ||
@@ -65,2 +73,3 @@ function fakePromise(value) { | ||
[Symbol.toStringTag]: 'Promise', | ||
__fakePromiseValue: value, | ||
}; | ||
@@ -120,3 +129,6 @@ } | ||
return { | ||
then() { | ||
then(_resolve, reject) { | ||
if (reject) { | ||
return fakePromise(reject(error)); | ||
} | ||
return this; | ||
@@ -136,2 +148,3 @@ }, | ||
}, | ||
__fakeRejectError: error, | ||
[Symbol.toStringTag]: 'Promise', | ||
@@ -213,1 +226,26 @@ }; | ||
} | ||
function isFakePromise(value) { | ||
return value?.__fakePromiseValue != null; | ||
} | ||
function isFakeRejectPromise(value) { | ||
return value?.__fakeRejectError != null; | ||
} | ||
function promiseLikeFinally(value, onFinally) { | ||
if ('finally' in value) { | ||
return value.finally(onFinally); | ||
} | ||
return value.then(res => { | ||
const finallyRes = onFinally(); | ||
return isPromise(finallyRes) ? finallyRes.then(() => res) : res; | ||
}, err => { | ||
const finallyRes = onFinally(); | ||
if (isPromise(finallyRes)) { | ||
return finallyRes.then(() => { | ||
throw err; | ||
}); | ||
} | ||
else { | ||
throw err; | ||
} | ||
}); | ||
} |
export function isPromise(value) { | ||
return value?.then != null; | ||
} | ||
export function handleMaybePromise(inputFactory, outputSuccessFactory, outputErrorFactory) { | ||
function _handleMaybePromise() { | ||
const input$ = inputFactory(); | ||
if (isPromise(input$)) { | ||
return input$.then(outputSuccessFactory, outputErrorFactory); | ||
} | ||
return outputSuccessFactory(input$); | ||
export function handleMaybePromise(inputFactory, outputSuccessFactory, outputErrorFactory, finallyFactory) { | ||
let input$; | ||
try { | ||
input$ = fakePromise(inputFactory()); | ||
} | ||
if (!outputErrorFactory) { | ||
return _handleMaybePromise(); | ||
catch (err) { | ||
input$ = fakeRejectPromise(err); | ||
} | ||
let result$; | ||
try { | ||
return _handleMaybePromise(); | ||
result$ = input$.then(outputSuccessFactory, outputErrorFactory); | ||
} | ||
catch (err) { | ||
return outputErrorFactory(err); | ||
result$ = fakeRejectPromise(err); | ||
} | ||
if (finallyFactory) { | ||
result$ = promiseLikeFinally(result$, finallyFactory); | ||
} | ||
if (isFakePromise(result$)) { | ||
return result$.__fakePromiseValue; | ||
} | ||
if (isFakeRejectPromise(result$)) { | ||
throw result$.__fakeRejectError; | ||
} | ||
return result$; | ||
} | ||
@@ -53,2 +61,3 @@ export function fakePromise(value) { | ||
[Symbol.toStringTag]: 'Promise', | ||
__fakePromiseValue: value, | ||
}; | ||
@@ -109,3 +118,6 @@ } | ||
return { | ||
then() { | ||
then(_resolve, reject) { | ||
if (reject) { | ||
return fakePromise(reject(error)); | ||
} | ||
return this; | ||
@@ -125,2 +137,3 @@ }, | ||
}, | ||
__fakeRejectError: error, | ||
[Symbol.toStringTag]: 'Promise', | ||
@@ -202,1 +215,26 @@ }; | ||
} | ||
function isFakePromise(value) { | ||
return value?.__fakePromiseValue != null; | ||
} | ||
function isFakeRejectPromise(value) { | ||
return value?.__fakeRejectError != null; | ||
} | ||
function promiseLikeFinally(value, onFinally) { | ||
if ('finally' in value) { | ||
return value.finally(onFinally); | ||
} | ||
return value.then(res => { | ||
const finallyRes = onFinally(); | ||
return isPromise(finallyRes) ? finallyRes.then(() => res) : res; | ||
}, err => { | ||
const finallyRes = onFinally(); | ||
if (isPromise(finallyRes)) { | ||
return finallyRes.then(() => { | ||
throw err; | ||
}); | ||
} | ||
else { | ||
throw err; | ||
} | ||
}); | ||
} |
{ | ||
"name": "@whatwg-node/promise-helpers", | ||
"version": "1.3.0-alpha-20250304144055-cac420c6056351f59061371db427cac2d2fb30ce", | ||
"version": "1.3.0-alpha-20250308083030-49b6ba959d4d6fde23c7cd945be7b959e6e43899", | ||
"description": "Promise helpers", | ||
@@ -17,3 +17,3 @@ "sideEffects": false, | ||
"engines": { | ||
"node": ">=18.0.0" | ||
"node": ">=16.0.0" | ||
}, | ||
@@ -20,0 +20,0 @@ "main": "cjs/index.js", |
@@ -5,5 +5,5 @@ export type MaybePromise<T> = Promise<T> | T; | ||
export declare function isPromise<T>(value: MaybePromiseLike<T>): value is PromiseLike<T>; | ||
export declare function handleMaybePromise<TInput, TOutput>(inputFactory: () => MaybePromise<TInput>, outputSuccessFactory: (value: TInput) => MaybePromise<TOutput>, outputErrorFactory?: (err: any) => MaybePromise<TOutput>): MaybePromise<TOutput>; | ||
export declare function handleMaybePromise<TInput, TOutput>(inputFactory: () => MaybePromiseLike<TInput>, outputSuccessFactory: (value: TInput) => MaybePromiseLike<TOutput>, outputErrorFactory?: (err: any) => MaybePromiseLike<TOutput>): MaybePromiseLike<TOutput>; | ||
export declare function fakePromise<T>(value: T): Promise<T>; | ||
export declare function handleMaybePromise<TInput, TOutput>(inputFactory: () => MaybePromise<TInput>, outputSuccessFactory: (value: TInput) => MaybePromise<TOutput>, outputErrorFactory?: (err: any) => MaybePromise<TOutput>, finallyFactory?: () => MaybePromise<void>): MaybePromise<TOutput>; | ||
export declare function handleMaybePromise<TInput, TOutput>(inputFactory: () => MaybePromiseLike<TInput>, outputSuccessFactory: (value: TInput) => MaybePromiseLike<TOutput>, outputErrorFactory?: (err: any) => MaybePromiseLike<TOutput>, finallyFactory?: () => MaybePromiseLike<void>): MaybePromiseLike<TOutput>; | ||
export declare function fakePromise<T>(value: T | MaybePromiseLike<T>): Promise<T>; | ||
export declare function fakePromise(value: void): Promise<void>; | ||
@@ -10,0 +10,0 @@ export interface DeferredPromise<T = void> { |
Sorry, the diff of this file is not supported yet
20122
12.88%511
18.01%