diff --git a/src/component/error_handling.ts b/src/component/error_handling.ts index f625b54e..07154a66 100644 --- a/src/component/error_handling.ts +++ b/src/component/error_handling.ts @@ -29,7 +29,7 @@ function _handleError(node: ComponentNode | null, error: any, isFirstRound = fal } if (stopped) { - if (isFirstRound && fiber) { + if (isFirstRound && fiber && fiber.node.fiber) { fiber.root!.counter--; } return true; diff --git a/tests/components/__snapshots__/error_handling.test.ts.snap b/tests/components/__snapshots__/error_handling.test.ts.snap index 7af49872..21b36a8f 100644 --- a/tests/components/__snapshots__/error_handling.test.ts.snap +++ b/tests/components/__snapshots__/error_handling.test.ts.snap @@ -780,6 +780,71 @@ exports[`can catch errors catching error, rethrow, render parent -- a main comp }" `; +exports[`can catch errors catching in child makes parent render 1`] = ` +"function anonymous(bdom, helpers +) { + let { text, createBlock, list, multi, html, toggler, component, comment } = bdom; + let { prepareList, capture, withKey } = helpers; + + function slot1(ctx, node, key = \\"\\") { + let Comp1 = ctx['elem'][1]; + return toggler(Comp1, component(Comp1, {id: ctx['elem'][0]}, key + \`__1\`, node, ctx)); + } + + return function template(ctx, node, key = \\"\\") { + ctx = Object.create(ctx); + const [k_block1, v_block1, l_block1, c_block1] = prepareList(Object.entries(this.elements)); + for (let i1 = 0; i1 < l_block1; i1++) { + ctx[\`elem\`] = v_block1[i1]; + let key1 = ctx['elem'][0]; + const v1 = ctx['elem']; + const ctx1 = capture(ctx); + c_block1[i1] = withKey(component(\`Catch\`, {onError: (error)=>this.onError(v1[0],error),slots: {'default': {__render: slot1, __ctx: ctx1}}}, key + \`__2__\${key1}\`, node, ctx), key1); + } + return list(c_block1); + } +}" +`; + +exports[`can catch errors catching in child makes parent render 2`] = ` +"function anonymous(bdom, helpers +) { + let { text, createBlock, list, multi, html, toggler, component, comment } = bdom; + let { callSlot } = helpers; + + return function template(ctx, node, key = \\"\\") { + return callSlot(ctx, node, key, 'default', false, {}); + } +}" +`; + +exports[`can catch errors catching in child makes parent render 3`] = ` +"function anonymous(bdom, helpers +) { + let { text, createBlock, list, multi, html, toggler, component, comment } = bdom; + + let block1 = createBlock(\`
\`); + + return function template(ctx, node, key = \\"\\") { + return block1(); + } +}" +`; + +exports[`can catch errors catching in child makes parent render 4`] = ` +"function anonymous(bdom, helpers +) { + let { text, createBlock, list, multi, html, toggler, component, comment } = bdom; + + let block1 = createBlock(\`