diff --git a/src/component/component_node.ts b/src/component/component_node.ts index 0ab5d7fc..8e193af7 100644 --- a/src/component/component_node.ts +++ b/src/component/component_node.ts @@ -127,7 +127,7 @@ export class ComponentNode implements VNode f.call(component))); } catch (e) { - handleError(this, e as Error); + handleError({ node: this, error: e }); return; } if (this.status === STATUS.NEW && this.fiber === fiber) { @@ -161,7 +161,7 @@ export class ComponentNode implements VNode = new WeakMap(); -export const nodeErrorHandlers: WeakMap void)[]> = new WeakMap(); +// Maps fibers to thrown errors +export const fibersInError: WeakMap = new WeakMap(); +export const nodeErrorHandlers: WeakMap void)[]> = new WeakMap(); -function _handleError(node: ComponentNode | null, error: Error, isFirstRound = false): boolean { +function _handleError(node: ComponentNode | null, error: any, isFirstRound = false): boolean { if (!node) { return false; } @@ -38,16 +39,12 @@ function _handleError(node: ComponentNode | null, error: Error, isFirstRound = f } } -export function handleError(entity: ComponentNode | Fiber, error: Error) { - let node: ComponentNode; - let fiber: Fiber; - if (entity instanceof Fiber) { - fiber = entity; - node = entity.node; - } else { - node = entity; - fiber = entity.fiber!; - } +type ErrorParams = { error: any } & ({ node: ComponentNode } | { fiber: Fiber }); +export function handleError(params: ErrorParams) { + const error = params.error; + const node = "node" in params ? params.node : params.fiber.node; + const fiber = "fiber" in params ? params.fiber : node.fiber!; + fibersInError.set(fiber.root, error); const handled = _handleError(node, error, true); diff --git a/src/component/fibers.ts b/src/component/fibers.ts index 32df804d..4ffaeb26 100644 --- a/src/component/fibers.ts +++ b/src/component/fibers.ts @@ -159,7 +159,7 @@ export class RootFiber extends Fiber { // unregistering the fiber node.fiber = null; } catch (e) { - if (!handleError(current || this, e)) { + if (!handleError({ fiber: current || this, error: e })) { this.reject(e); } } @@ -206,7 +206,7 @@ export class MountFiber extends RootFiber { } node.fiber = null; } catch (e) { - if (!handleError(current as Fiber, e)) { + if (!handleError({ fiber: current as Fiber, error: e })) { this.reject(e); } }