Skip to content

Commit

Permalink
fix(ssr): reset current instance if setting up options component erro…
Browse files Browse the repository at this point in the history
…rs (#7743)

close #7733
  • Loading branch information
DrPhil authored May 19, 2023
1 parent 372ec35 commit 020851e
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 3 deletions.
9 changes: 6 additions & 3 deletions packages/runtime-core/src/component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -903,9 +903,12 @@ export function finishComponentSetup(
if (__FEATURE_OPTIONS_API__ && !(__COMPAT__ && skipOptions)) {
setCurrentInstance(instance)
pauseTracking()
applyOptions(instance)
resetTracking()
unsetCurrentInstance()
try {
applyOptions(instance)
} finally {
resetTracking()
unsetCurrentInstance()
}
}

// warn missing template/render
Expand Down
44 changes: 44 additions & 0 deletions packages/server-renderer/__tests__/render.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -793,6 +793,50 @@ function testRender(type: string, render: typeof renderToString) {
} catch {}
expect(getCurrentInstance()).toBe(prev)
})

// #7733
test('reset current instance after error in data', async () => {
const prev = getCurrentInstance()
expect(prev).toBe(null)
try {
await render(
createApp({
data() {
throw new Error()
},
template: `<div>hello</div>`
})
)
} catch {}
expect(getCurrentInstance()).toBe(null)
})
})

// #7733
test('reset current instance after error in errorCaptured', async () => {
const prev = getCurrentInstance()

expect(prev).toBe(null)

const Child = {
created() {
throw new Error()
}
}
try {
await render(
createApp({
errorCaptured() {
throw new Error()
},
render: () => h(Child)
})
)
} catch {}
expect(
'Unhandled error during execution of errorCaptured hook'
).toHaveBeenWarned()
expect(getCurrentInstance()).toBe(null)
})

test('serverPrefetch', async () => {
Expand Down

0 comments on commit 020851e

Please sign in to comment.