UNPKG

@tanstack/vue-router

Version:

Modern and scalable routing for Vue applications

75 lines 2.55 kB
import * as Vue from 'vue'; import { composeSsrBodyScripts, getSsrBodyScriptParts, } from '@tanstack/router-core'; import { isServer } from '@tanstack/router-core/isServer'; import { useSelector } from '@tanstack/vue-store'; import { Asset } from './Asset'; import { useRouter } from './useRouter'; /** * During streaming SSR, `<Scripts>` marks where late hydration scripts may * begin to be inserted. */ export const Scripts = Vue.defineComponent({ name: 'Scripts', setup() { const router = useRouter(); const nonce = router.options.ssr?.nonce; const matches = useSelector(router.stores.matches, (value) => value); const scripts = Vue.computed(() => getSsrBodyScriptParts(matches.value, router.ssr?.manifest, nonce)); const mounted = Vue.ref(false); Vue.onMounted(() => { mounted.value = true; }); return () => { return renderScripts(router, scripts.value, mounted.value, nonce); }; }, }); function renderScripts(router, scriptParts, mounted, nonce) { const allScripts = []; let streamBoundary; const [scripts, assetScripts] = scriptParts; if ((isServer ?? router.isServer) && router.serverSsr) { const initialHydrationScripts = router.serverSsr.takeInitialHydrationScriptTags(); allScripts.push(...composeSsrBodyScripts(scriptParts, initialHydrationScripts)); return renderScriptTags(allScripts); } else if (router.ssr && !mounted) { allScripts.push({ tag: 'script', attrs: { nonce, 'data-allow-mismatch': true }, children: '', }); streamBoundary = { tag: 'script', attrs: { nonce, 'data-allow-mismatch': true, }, children: '', }; for (const asset of assetScripts) { allScripts.push({ tag: 'script', attrs: { ...asset.attrs, 'data-allow-mismatch': true, }, children: '', }); } } allScripts.push(...scripts); if (mounted) { allScripts.push(...assetScripts); } if (streamBoundary) { allScripts.push(streamBoundary); } return renderScriptTags(allScripts); } function renderScriptTags(allScripts) { return (<> {allScripts.map((asset, i) => (<Asset {...asset} key={`tsr-scripts-${asset.tag}-${i}`}/>))} </>); } //# sourceMappingURL=Scripts.jsx.map