Skip to content

Commit 7e4eac6

Browse files
committed
fix(nuxt): force asyncData errorValue/value to be undefined
1 parent a3698c0 commit 7e4eac6

File tree

4 files changed

+22
-24
lines changed

4 files changed

+22
-24
lines changed

packages/nuxt/src/app/composables/asyncData.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ export function useAsyncData<
296296

297297
const isWithinClientOnly = instance && (instance._nuxtClientOnly || inject(clientOnlySymbol, false))
298298

299-
if (fetchOnServer && nuxtApp.isHydrating && (asyncData.error.value || asyncData.data.value !== asyncDataDefaults.value)) {
299+
if (fetchOnServer && nuxtApp.isHydrating && (asyncData.error.value || asyncData.data.value !== undefined)) {
300300
// 1. Hydration (server: true): no fetch
301301
if (pendingWhenIdle) {
302302
asyncData.pending.value = false
@@ -333,7 +333,7 @@ export function useAsyncData<
333333
}
334334
}
335335
const unsubKey = watch(key, (newKey, oldKey) => {
336-
const hasRun = nuxtApp._asyncData[oldKey]?.data.value !== asyncDataDefaults.value
336+
const hasRun = nuxtApp._asyncData[oldKey]?.data.value !== undefined
337337
if (oldKey && oldKey !== newKey) {
338338
unregister(oldKey)
339339
}
@@ -486,7 +486,7 @@ export function useNuxtData<DataT = any> (key: string): { data: Ref<DataT | unde
486486

487487
// Initialize value when key is not already set
488488
if (!(key in nuxtApp.payload.data)) {
489-
nuxtApp.payload.data[key] = asyncDataDefaults.value
489+
nuxtApp.payload.data[key] = undefined
490490
}
491491

492492
if (nuxtApp._asyncData[key]) {
@@ -548,16 +548,16 @@ export function clearNuxtData (keys?: string | string[] | ((key: string) => bool
548548

549549
function clearNuxtDataByKey (nuxtApp: NuxtApp, key: string): void {
550550
if (key in nuxtApp.payload.data) {
551-
nuxtApp.payload.data[key] = asyncDataDefaults.value
551+
nuxtApp.payload.data[key] = undefined
552552
}
553553

554554
if (key in nuxtApp.payload._errors) {
555-
nuxtApp.payload._errors[key] = asyncDataDefaults.errorValue
555+
nuxtApp.payload._errors[key] = undefined
556556
}
557557

558558
if (nuxtApp._asyncData[key]) {
559559
nuxtApp._asyncData[key]!.data.value = unref(nuxtApp._asyncData[key]!._default())
560-
nuxtApp._asyncData[key]!.error.value = asyncDataDefaults.errorValue
560+
nuxtApp._asyncData[key]!.error.value = undefined
561561
if (pendingWhenIdle) {
562562
nuxtApp._asyncData[key]!.pending.value = false
563563
}
@@ -592,7 +592,7 @@ function createAsyncData<
592592
PickKeys extends KeysOf<DataT> = KeysOf<DataT>,
593593
DefaultT = undefined,
594594
> (nuxtApp: NuxtApp, key: string, _handler: (ctx?: NuxtApp) => Promise<ResT>, options: AsyncDataOptions<ResT, DataT, PickKeys, DefaultT>, initialCachedData?: NoInfer<DataT>): CreatedAsyncData<ResT, NuxtErrorDataT, DataT, DefaultT> {
595-
nuxtApp.payload._errors[key] ??= asyncDataDefaults.errorValue
595+
nuxtApp.payload._errors[key] ??= undefined
596596

597597
const hasCustomGetCachedData = options.getCachedData !== getDefaultCachedData
598598

@@ -610,7 +610,7 @@ function createAsyncData<
610610
}
611611

612612
const _ref = options.deep ? ref : shallowRef
613-
const hasCachedData = initialCachedData !== asyncDataDefaults.value
613+
const hasCachedData = initialCachedData !== undefined
614614
const unsubRefreshAsyncData = nuxtApp.hook('app:data:refresh', async (keys) => {
615615
if (!keys || keys.includes(key)) {
616616
await asyncData.execute({ cause: 'refresh:hook' })
@@ -632,9 +632,9 @@ function createAsyncData<
632632
// Avoid fetching same key that is already fetched
633633
if (granularCachedData || opts.cause === 'initial' || nuxtApp.isHydrating) {
634634
const cachedData = 'cachedData' in opts ? opts.cachedData : options.getCachedData!(key, nuxtApp, { cause: opts.cause ?? 'refresh:manual' })
635-
if (cachedData !== asyncDataDefaults.value) {
635+
if (cachedData !== undefined) {
636636
nuxtApp.payload.data[key] = asyncData.data.value = cachedData as DataT
637-
asyncData.error.value = asyncDataDefaults.errorValue
637+
asyncData.error.value = undefined
638638
asyncData.status.value = 'success'
639639
return Promise.resolve(cachedData)
640640
}
@@ -675,7 +675,7 @@ function createAsyncData<
675675
nuxtApp.payload.data[key] = result
676676

677677
asyncData.data.value = result
678-
asyncData.error.value = asyncDataDefaults.errorValue
678+
asyncData.error.value = undefined
679679
asyncData.status.value = 'success'
680680
})
681681
.catch((error: any) => {
@@ -724,7 +724,7 @@ function createAsyncData<
724724
}
725725

726726
// Used to get default values
727-
const getDefault = () => asyncDataDefaults.value
727+
const getDefault = () => undefined
728728
const getDefaultCachedData: AsyncDataOptions<any>['getCachedData'] = (key, nuxtApp, ctx) => {
729729
if (nuxtApp.isHydrating) {
730730
return nuxtApp.payload.data[key]

packages/nuxt/src/core/templates.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,11 @@ export const nuxtConfigTemplate: NuxtTemplate = {
571571
`export const devRootDir = ${ctx.nuxt.options.dev ? JSON.stringify(ctx.nuxt.options.rootDir) : 'null'}`,
572572
`export const devLogs = ${JSON.stringify(ctx.nuxt.options.features.devLogs)}`,
573573
`export const nuxtLinkDefaults = ${JSON.stringify(ctx.nuxt.options.experimental.defaults.nuxtLink)}`,
574-
`export const asyncDataDefaults = ${JSON.stringify(ctx.nuxt.options.experimental.defaults.useAsyncData)}`,
574+
`export const asyncDataDefaults = ${JSON.stringify({
575+
...ctx.nuxt.options.experimental.defaults.useAsyncData,
576+
errorValue: undefined,
577+
value: undefined,
578+
})}`,
575579
`export const fetchDefaults = ${JSON.stringify(fetchDefaults)}`,
576580
`export const vueAppRootContainer = ${ctx.nuxt.options.app.rootAttrs.id ? `'#${ctx.nuxt.options.app.rootAttrs.id}'` : `'body > ${ctx.nuxt.options.app.rootTag}'`}`,
577581
`export const viewTransition = ${ctx.nuxt.options.experimental.viewTransition}`,

test/fixtures/basic/pages/useAsyncData/immediate-remove-unmounted.vue

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,9 @@
2020
</template>
2121

2222
<script setup lang="ts">
23-
// @ts-expect-error virtual file
24-
import { asyncDataDefaults } from '#build/nuxt.config.mjs'
25-
2623
const { data, execute } = await useAsyncData('immediateFalse', () => $fetch('/api/random'), { immediate: false })
2724
28-
if (data.value !== asyncDataDefaults.value) {
29-
throw new Error(`Initial data should be ${asyncDataDefaults.value}: ` + data.value)
25+
if (data.value !== undefined) {
26+
throw new Error(`Initial data should be undefined: ` + data.value)
3027
}
3128
</script>

test/nuxt/composables.test.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,6 @@ import { useRouteAnnouncer } from '#app/composables/route-announcer'
2626
import { encodeURL, resolveRouteObject } from '#app/composables/router'
2727
import { useRuntimeHook } from '#app/composables/runtime-hook'
2828

29-
// @ts-expect-error virtual file
30-
import { asyncDataDefaults } from '#build/nuxt.config.mjs'
31-
3229
registerEndpoint('/api/test', defineEventHandler(event => ({
3330
method: event.method,
3431
headers: Object.fromEntries(event.headers.entries()),
@@ -350,7 +347,7 @@ describe('useAsyncData', () => {
350347

351348
await flushPromises()
352349

353-
expect(res.data.value).toBe(asyncDataDefaults.value)
350+
expect(res.data.value).toBe(undefined)
354351
expect(res.status.value).toBe('idle')
355352
expect(res.pending.value).toBe(false)
356353

@@ -361,7 +358,7 @@ describe('useAsyncData', () => {
361358
}, { lazy: true },
362359
)
363360

364-
expect(res2.data.value).toBe(asyncDataDefaults.value)
361+
expect(res2.data.value).toBe(undefined)
365362
expect(res2.status.value).toBe('pending')
366363
expect(res2.pending.value).toBe(true)
367364

@@ -597,7 +594,7 @@ describe('useAsyncData', () => {
597594
expect(useNuxtData(firstKey).data.value).toBeUndefined()
598595
expect(useNuxtData(secondKey).data.value).toBe(secondKey)
599596

600-
expect(useNuxtApp()._asyncData[firstKey]!.data.value).toBe(asyncDataDefaults.value)
597+
expect(useNuxtApp()._asyncData[firstKey]!.data.value).toBe(undefined)
601598
expect(useNuxtApp()._asyncData[secondKey]!.data.value).toBe(secondKey)
602599

603600
comp.unmount()

0 commit comments

Comments
 (0)