-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathcomposables.ts
More file actions
81 lines (69 loc) · 2 KB
/
composables.ts
File metadata and controls
81 lines (69 loc) · 2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import type { DefineComponent } from 'vue'
import { useNuxtApp } from '#imports'
import { defu } from 'defu'
import type { DirectImportInfo } from './schema'
export function useLazyComponentTracking(components: DirectImportInfo[] = []) {
const nuxtApp = useNuxtApp()
if (!nuxtApp.payload.__hints?.lazyHydrationState) {
nuxtApp.payload.__hints = defu(nuxtApp.payload.__hints, {
lazyHydrationState: {
directImports: new Map(),
hasReported: false,
pageLoaded: false,
},
})
}
const state = nuxtApp.payload.__hints.lazyHydrationState
for (const comp of components) {
state.directImports.set(comp.componentName, comp)
}
return state
}
/**
* Wrap components definition like with defineComponent or defineNuxtComponent or just sfc exports
*/
export function __wrapMainComponent(
component: DefineComponent,
imports: DirectImportInfo[] = [],
): DefineComponent {
const originalSetup = component.setup
component.setup = (props, ctx) => {
useLazyComponentTracking(imports)
return originalSetup ? originalSetup(props, ctx) : undefined
}
return component
}
/**
* Wrap imported components to track their usage.
*/
export function __wrapImportedComponent(
component: DefineComponent,
componentName: string,
importSource: string,
importedBy: string,
) {
if (component && component.name === 'AsyncComponentWrapper') {
// already wrapped by defineAsyncComponent
return component
}
const originalSetup = component.setup
component.setup = (props, ctx) => {
const state = useLazyComponentTracking()
if (state) {
if (!state.directImports.has(componentName)) {
state.directImports.set(componentName, {
componentName,
importSource,
importedBy,
rendered: false,
})
}
const info = state.directImports.get(componentName)
if (info) {
info.rendered = true
}
}
return originalSetup ? originalSetup(props, ctx) : undefined
}
return component
}