Skip to content

Commit e4568d9

Browse files
authored
refactor: move from NuxtApp augment to NuxtPayload (#240)
1 parent c3c969f commit e4568d9

File tree

10 files changed

+44
-34
lines changed

10 files changed

+44
-34
lines changed

client/app/composables/host.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export function useHostThirdPartyScripts() {
1010
}
1111

1212
return {
13-
scripts: client.host.nuxt.__hints_tpc,
13+
scripts: client.host.nuxt.payload.__hints.thirdPartyScripts,
1414
isUsingNuxtScripts: Boolean(client.host.nuxt.$scripts),
1515
}
1616
}
@@ -47,7 +47,7 @@ export function useHostWebVitals() {
4747
export function useHostHydration() {
4848
const host = useHostNuxt()
4949

50-
return { hydration: host.__hints.hydration }
50+
return { hydration: host.payload.__hints.hydration }
5151
}
5252

5353
export function useHostNuxt() {

client/app/plugins/hydration.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export default defineNuxtPlugin(() => {
77
const nuxtApp = useNuxtApp()
88
const hydrationMismatches = ref<(HydrationMismatchPayload | LocalHydrationMismatch)[]>([])
99

10-
hydrationMismatches.value = [...host.__hints.hydration]
10+
hydrationMismatches.value = [...host.payload.__hints.hydration]
1111

1212
$fetch<HydrationMismatchResponse>(new URL(HYDRATION_ROUTE, window.location.origin).href).then((data: { mismatches: HydrationMismatchPayload[] }) => {
1313
hydrationMismatches.value = [...hydrationMismatches.value, ...data.mismatches.filter(m => !hydrationMismatches.value.some(existing => existing.id === m.id))]

src/runtime/hydration/composables.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export function useHydrationCheck() {
4343
method: 'POST',
4444
body,
4545
}).then((payload) => {
46-
nuxtApp.__hints.hydration.push({
46+
nuxtApp.payload.__hints.hydration.push({
4747
...payload,
4848
instance,
4949
vnode: vnodePrehydration,

src/runtime/hydration/plugin.client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export default defineNuxtPlugin({
55
name: '@nuxt/hints:hydration',
66
setup() {
77
const nuxtApp = useNuxtApp()
8-
nuxtApp.__hints = defu(nuxtApp.__hints, {
8+
nuxtApp.payload.__hints = defu(nuxtApp.payload.__hints, {
99
hydration: [],
1010
})
1111
},

src/runtime/lazy-load/composables.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
import type { DefineComponent } from 'vue'
22
import { useNuxtApp } from '#imports'
3+
import { defu } from 'defu'
34
import type { DirectImportInfo } from './schema'
45

56
export function useLazyComponentTracking(components: DirectImportInfo[] = []) {
67
const nuxtApp = useNuxtApp()
7-
if (!nuxtApp.payload._lazyHydrationState) {
8-
nuxtApp.payload._lazyHydrationState = {
9-
directImports: new Map(),
10-
hasReported: false,
11-
pageLoaded: false,
12-
}
8+
if (!nuxtApp.payload.__hints?.lazyHydrationState) {
9+
nuxtApp.payload.__hints = defu(nuxtApp.payload.__hints, {
10+
lazyHydrationState: {
11+
directImports: new Map(),
12+
hasReported: false,
13+
pageLoaded: false,
14+
},
15+
})
1316
}
1417

15-
const state = nuxtApp.payload._lazyHydrationState
18+
const state = nuxtApp.payload.__hints.lazyHydrationState
1619

1720
for (const comp of components) {
1821
state.directImports.set(comp.componentName, comp)

src/runtime/lazy-load/plugin.client.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export default defineNuxtPlugin({
1111
setup() {
1212
const nuxtApp = useNuxtApp()
1313

14-
nuxtApp.__hints = defu(nuxtApp.__hints, {
14+
nuxtApp.payload.__hints = defu(nuxtApp.payload.__hints, {
1515
lazyComponents: [],
1616
})
1717

@@ -52,7 +52,7 @@ function checkAndReport(state: ComponentLazyLoadState) {
5252
function reportSuggestions(suggestions: DirectImportInfo[]) {
5353
const route = useRoute()
5454
const nuxtApp = useNuxtApp()
55-
nuxtApp.__hints.lazyComponents = suggestions
55+
nuxtApp.payload.__hints.lazyComponents = suggestions
5656

5757
logger.info(
5858
`${suggestions.length} component has not been rendered in SSR nor rendered at hydration time. Consider lazy loading it:\n`,

src/runtime/third-party-scripts/plugin.client.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { defineNuxtPlugin, ref, useNuxtApp } from '#imports'
2+
import { defu } from 'defu'
23
import { logger } from '../logger'
34

45
const EXTENSIONS_SCHEMES_RE = /^(chrome-extension|moz-extension|safari-extension|ms-browser-extension):/
@@ -32,7 +33,10 @@ export default defineNuxtPlugin({
3233
setup() {
3334
const nuxtApp = useNuxtApp()
3435

35-
const scripts = nuxtApp.__hints_tpc = ref<{ element: HTMLScriptElement, loaded: boolean }[]>([])
36+
nuxtApp.payload.__hints = defu(nuxtApp.payload.__hints, {
37+
thirdPartyScripts: ref<{ element: HTMLScriptElement, loaded: boolean }[]>([]),
38+
})
39+
const scripts = nuxtApp.payload.__hints.thirdPartyScripts
3640

3741
const isUsingNuxtScripts = !!nuxtApp.$scripts
3842

src/runtime/types.d.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,29 +27,32 @@ declare module '#app' {
2727
'hints:scripts:added': (script: HTMLScriptElement) => void
2828
'hints:scripts:loaded': (script: HTMLScriptElement) => void
2929

30-
'hints:webvitals:sync': (webvitals: NuxtApp['__hints']['webvitals']) => void
30+
'hints:webvitals:sync': (webvitals: NuxtPayload['__hints']['webvitals']) => void
3131
'hints:webvitals:lcp': (metric: LCPMetricWithAttribution) => void
3232
'hints:webvitals:inp': (metric: INPMetricWithAttribution) => void
3333
'hints:webvitals:cls': (metric: CLSMetricWithAttribution) => void
3434
}
3535

3636
interface NuxtApp {
37-
__hints_tpc: Ref<{ element: HTMLScriptElement, loaded: boolean }[]>
37+
__tracerOverlay: typeof import('vite-plugin-vue-tracer/client/overlay')
38+
__tracerRecord: typeof import('vite-plugin-vue-tracer/client/record')
39+
}
40+
41+
interface NuxtPayload {
3842
__hints: {
43+
lazyHydrationState?: LazyHydrationState
3944
hydration: LocalHydrationMismatch[]
4045
lazyComponents: DirectImportInfo[]
4146
webvitals: {
4247
lcp: Ref<LCPMetricWithAttribution[]>
4348
inp: Ref<INPMetricWithAttribution[]>
4449
cls: Ref<CLSMetricWithAttribution[]>
4550
}
51+
thirdPartyScripts: Ref<{
52+
element: HTMLScriptElement
53+
loaded: boolean
54+
}[]>
4655
}
47-
__tracerOverlay: typeof import('vite-plugin-vue-tracer/client/overlay')
48-
__tracerRecord: typeof import('vite-plugin-vue-tracer/client/record')
49-
}
50-
51-
interface NuxtPayload {
52-
_lazyHydrationState?: LazyHydrationState
5356
}
5457
}
5558

src/runtime/web-vitals/plugin.client.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export default defineNuxtPlugin({
2828
name: 'nuxt-hints:performance',
2929
setup() {
3030
const nuxtApp = useNuxtApp()
31-
nuxtApp.__hints = defu(nuxtApp.__hints, {
31+
nuxtApp.payload.__hints = defu(nuxtApp.payload.__hints, {
3232
webvitals: {
3333
lcp: ref([]),
3434
inp: ref([]),
@@ -37,9 +37,9 @@ export default defineNuxtPlugin({
3737
})
3838

3939
nuxtApp.hook('hints:webvitals:sync', (webvitals) => {
40-
webvitals.lcp.value = [...nuxtApp.__hints.webvitals.lcp.value]
41-
webvitals.inp.value = [...nuxtApp.__hints.webvitals.inp.value]
42-
webvitals.cls.value = [...nuxtApp.__hints.webvitals.cls.value]
40+
webvitals.lcp.value = [...nuxtApp.payload.__hints.webvitals.lcp.value]
41+
webvitals.inp.value = [...nuxtApp.payload.__hints.webvitals.inp.value]
42+
webvitals.cls.value = [...nuxtApp.payload.__hints.webvitals.cls.value]
4343
})
4444

4545
nuxtApp.hook('app:mounted', () => {
@@ -51,7 +51,7 @@ export default defineNuxtPlugin({
5151
'[web-vitals] INP Metric: ',
5252
metric,
5353
)
54-
nuxtApp.__hints.webvitals.inp.value.push(metric)
54+
nuxtApp.payload.__hints.webvitals.inp.value.push(metric)
5555
nuxtApp.callHook('hints:webvitals:inp', metric)
5656
}, {
5757
reportAllChanges: true,
@@ -65,7 +65,7 @@ export default defineNuxtPlugin({
6565
`[web-vitals] LCP Metric: `,
6666
metric,
6767
)
68-
nuxtApp.__hints.webvitals.lcp.value.push(metric)
68+
nuxtApp.payload.__hints.webvitals.lcp.value.push(metric)
6969
nuxtApp.callHook('hints:webvitals:lcp', metric)
7070

7171
for (const performanceEntry of metric.entries) {
@@ -130,7 +130,7 @@ export default defineNuxtPlugin({
130130
metric,
131131
)
132132
// Push the metric as-is; components will access entries[0] directly for element
133-
nuxtApp.__hints.webvitals.cls.value.push(metric)
133+
nuxtApp.payload.__hints.webvitals.cls.value.push(metric)
134134

135135
for (const entry of metric.entries) {
136136
const performanceEntry = entry

test/runtime/lazy-load/composables.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ describe('lazy-load composables', () => {
1919
beforeEach(() => {
2020
const nuxtApp = useNuxtApp()
2121
// Reset lazy hydration state between tests
22-
delete nuxtApp.payload._lazyHydrationState
22+
delete nuxtApp.payload.__hints?.lazyHydrationState
2323
})
2424

2525
describe('useLazyComponentTracking', () => {
@@ -90,7 +90,7 @@ describe('lazy-load composables', () => {
9090
wrapped.setup!({}, { attrs: {}, slots: {}, emit: () => {}, expose: () => {} })
9191

9292
const nuxtApp = useNuxtApp()
93-
const state = nuxtApp.payload._lazyHydrationState
93+
const state = nuxtApp.payload.__hints?.lazyHydrationState
9494
expect(state).toBeDefined()
9595
expect(state.directImports.get('Child')).toEqual(imports[0])
9696
})
@@ -121,7 +121,7 @@ describe('lazy-load composables', () => {
121121
wrapped.setup!({}, { attrs: {}, slots: {}, emit: () => {}, expose: () => {} })
122122

123123
const nuxtApp = useNuxtApp()
124-
const state = nuxtApp.payload._lazyHydrationState
124+
const state = nuxtApp.payload.__hints?.lazyHydrationState
125125
expect(state).toBeDefined()
126126
expect(state.directImports.get('MyComp')).toEqual({
127127
componentName: 'MyComp',
@@ -142,7 +142,7 @@ describe('lazy-load composables', () => {
142142
wrapped.setup!({}, { attrs: {}, slots: {}, emit: () => {}, expose: () => {} })
143143

144144
const nuxtApp = useNuxtApp()
145-
const state = nuxtApp.payload._lazyHydrationState
145+
const state = nuxtApp.payload.__hints?.lazyHydrationState
146146
// Should keep original import source since entry already existed
147147
expect(state.directImports.get('MyComp')!.importSource).toBe('./Original.vue')
148148
// But rendered should be true

0 commit comments

Comments
 (0)