|
1 | 1 | <script setup lang="ts"> |
2 | | -import { useDevtoolsClient, onDevtoolsClientConnected } from '@nuxt/devtools-kit/iframe-client' |
3 | | -import type { HintsClientFunctions } from '../../src/runtime/core/rpc-types' |
4 | | -import { RPC_NAMESPACE } from '../../src/runtime/core/rpc-types' |
5 | | -import type { HydrationMismatchPayload, HydrationMismatchResponse, LocalHydrationMismatch } from '../../src/runtime/hydration/types' |
6 | | -import type { ComponentLazyLoadData } from '../../src/runtime/lazy-load/schema' |
7 | | -import { ComponentLazyLoadDataSchema } from '../../src/runtime/lazy-load/schema' |
8 | | -import type { HtmlValidateReport } from '../../src/runtime/html-validate/types' |
9 | | -import { parse } from 'valibot' |
10 | | -import { HYDRATION_ROUTE, LAZY_LOAD_ROUTE, HTML_VALIDATE_ROUTE } from './utils/routes' |
| 2 | +import { useDevtoolsClient } from '@nuxt/devtools-kit/iframe-client' |
11 | 3 |
|
12 | 4 | const client = useDevtoolsClient() |
13 | | -
|
14 | | -const hydrationMismatches = ref<(HydrationMismatchPayload | LocalHydrationMismatch)[]>([]) |
15 | | -const lazyLoadHints = ref<ComponentLazyLoadData[]>([]) |
16 | | -const htmlValidateReports = ref<HtmlValidateReport[]>([]) |
17 | | -
|
18 | | -const nuxtApp = useNuxtApp() |
19 | | -nuxtApp.provide('hydrationMismatches', hydrationMismatches) |
20 | | -nuxtApp.provide('lazyLoadHints', lazyLoadHints) |
21 | | -nuxtApp.provide('htmlValidateReports', htmlValidateReports) |
22 | | -
|
23 | | -onDevtoolsClientConnected((client) => { |
24 | | - // Hydration: seed from host payload and fetch from server |
25 | | - if (useHintsFeature('hydration')) { |
26 | | - hydrationMismatches.value = [...client.host.nuxt.payload.__hints.hydration] |
27 | | - $fetch<HydrationMismatchResponse>(new URL(HYDRATION_ROUTE, window.location.origin).href).then((data) => { |
28 | | - hydrationMismatches.value = [ |
29 | | - ...hydrationMismatches.value, |
30 | | - ...data.mismatches.filter(m => !hydrationMismatches.value.some(existing => existing.id === m.id)), |
31 | | - ] |
32 | | - }) |
33 | | - } |
34 | | -
|
35 | | - // Lazy load: fetch from server |
36 | | - if (useHintsFeature('lazyLoad')) { |
37 | | - $fetch<ComponentLazyLoadData[]>(new URL(LAZY_LOAD_ROUTE, window.location.origin).href).then((data) => { |
38 | | - lazyLoadHints.value = [ |
39 | | - ...lazyLoadHints.value, |
40 | | - ...(data ?? []).filter(d => !lazyLoadHints.value.some(existing => existing.id === d.id)), |
41 | | - ] |
42 | | - }) |
43 | | - } |
44 | | -
|
45 | | - // HTML validate: fetch from server |
46 | | - if (useHintsFeature('htmlValidate')) { |
47 | | - $fetch<HtmlValidateReport[]>(new URL(HTML_VALIDATE_ROUTE, window.location.origin).href).then((data) => { |
48 | | - htmlValidateReports.value = [ |
49 | | - ...htmlValidateReports.value, |
50 | | - ...(data ?? []).filter(d => !htmlValidateReports.value.some(existing => existing.id === d.id)), |
51 | | - ] |
52 | | - }) |
53 | | - } |
54 | | -
|
55 | | - // Register client RPC functions for real-time push notifications |
56 | | - client.devtools.extendClientRpc<Record<string, unknown>, HintsClientFunctions>(RPC_NAMESPACE, { |
57 | | - onHydrationMismatch(mismatch: HydrationMismatchPayload) { |
58 | | - if (!hydrationMismatches.value.some(existing => existing.id === mismatch.id)) { |
59 | | - hydrationMismatches.value.push(mismatch) |
60 | | - } |
61 | | - }, |
62 | | - onHydrationCleared(ids: string[]) { |
63 | | - hydrationMismatches.value = hydrationMismatches.value.filter(m => !ids.includes(m.id)) |
64 | | - }, |
65 | | - onLazyLoadReport(data: ComponentLazyLoadData) { |
66 | | - try { |
67 | | - const validated = parse(ComponentLazyLoadDataSchema, data) |
68 | | - if (!lazyLoadHints.value.some(existing => existing.id === validated.id)) { |
69 | | - lazyLoadHints.value.push(validated) |
70 | | - } |
71 | | - } |
72 | | - catch { |
73 | | - console.warn('[hints] Ignoring malformed lazy-load report', data) |
74 | | - } |
75 | | - }, |
76 | | - onLazyLoadCleared(id: string) { |
77 | | - lazyLoadHints.value = lazyLoadHints.value.filter(entry => entry.id !== id) |
78 | | - }, |
79 | | - onHtmlValidateReport(report: HtmlValidateReport) { |
80 | | - if (!htmlValidateReports.value.some(existing => existing.id === report.id)) { |
81 | | - htmlValidateReports.value = [...htmlValidateReports.value, report] |
82 | | - } |
83 | | - }, |
84 | | - onHtmlValidateDeleted(id: string) { |
85 | | - htmlValidateReports.value = htmlValidateReports.value.filter(report => report.id !== id) |
86 | | - }, |
87 | | - }) |
88 | | -}) |
89 | 5 | </script> |
90 | 6 |
|
91 | 7 | <template> |
|
0 commit comments