@tanstack/vue-router 1.167.1 → 1.167.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/Asset.js +107 -151
- package/dist/esm/Asset.js.map +1 -1
- package/dist/esm/Body.js +15 -24
- package/dist/esm/Body.js.map +1 -1
- package/dist/esm/CatchBoundary.js +112 -130
- package/dist/esm/CatchBoundary.js.map +1 -1
- package/dist/esm/ClientOnly.js +59 -29
- package/dist/esm/ClientOnly.js.map +1 -1
- package/dist/esm/HeadContent.dev.js +29 -23
- package/dist/esm/HeadContent.dev.js.map +1 -1
- package/dist/esm/HeadContent.js +21 -16
- package/dist/esm/HeadContent.js.map +1 -1
- package/dist/esm/Html.js +42 -61
- package/dist/esm/Html.js.map +1 -1
- package/dist/esm/Match.js +238 -319
- package/dist/esm/Match.js.map +1 -1
- package/dist/esm/Matches.js +127 -170
- package/dist/esm/Matches.js.map +1 -1
- package/dist/esm/RouterProvider.js +50 -65
- package/dist/esm/RouterProvider.js.map +1 -1
- package/dist/esm/ScriptOnce.js +31 -36
- package/dist/esm/ScriptOnce.js.map +1 -1
- package/dist/esm/Scripts.js +79 -101
- package/dist/esm/Scripts.js.map +1 -1
- package/dist/esm/ScrollRestoration.js +25 -29
- package/dist/esm/ScrollRestoration.js.map +1 -1
- package/dist/esm/Transitioner.js +146 -164
- package/dist/esm/Transitioner.js.map +1 -1
- package/dist/esm/awaited.js +27 -34
- package/dist/esm/awaited.js.map +1 -1
- package/dist/esm/fileRoute.js +90 -92
- package/dist/esm/fileRoute.js.map +1 -1
- package/dist/esm/headContentUtils.js +92 -123
- package/dist/esm/headContentUtils.js.map +1 -1
- package/dist/esm/index.dev.js +16 -118
- package/dist/esm/index.js +18 -119
- package/dist/esm/lazyRouteComponent.js +69 -82
- package/dist/esm/lazyRouteComponent.js.map +1 -1
- package/dist/esm/link.js +364 -385
- package/dist/esm/link.js.map +1 -1
- package/dist/esm/matchContext.js +16 -11
- package/dist/esm/matchContext.js.map +1 -1
- package/dist/esm/not-found.js +30 -40
- package/dist/esm/not-found.js.map +1 -1
- package/dist/esm/renderRouteNotFound.js +20 -15
- package/dist/esm/renderRouteNotFound.js.map +1 -1
- package/dist/esm/route.js +196 -174
- package/dist/esm/route.js.map +1 -1
- package/dist/esm/router.js +11 -11
- package/dist/esm/router.js.map +1 -1
- package/dist/esm/routerContext.js +10 -7
- package/dist/esm/routerContext.js.map +1 -1
- package/dist/esm/scroll-restoration.js +39 -50
- package/dist/esm/scroll-restoration.js.map +1 -1
- package/dist/esm/ssr/RouterClient.js +29 -43
- package/dist/esm/ssr/RouterClient.js.map +1 -1
- package/dist/esm/ssr/RouterServer.js +29 -32
- package/dist/esm/ssr/RouterServer.js.map +1 -1
- package/dist/esm/ssr/client.js +1 -4
- package/dist/esm/ssr/defaultRenderHandler.js +11 -13
- package/dist/esm/ssr/defaultRenderHandler.js.map +1 -1
- package/dist/esm/ssr/defaultStreamHandler.js +12 -15
- package/dist/esm/ssr/defaultStreamHandler.js.map +1 -1
- package/dist/esm/ssr/renderRouterToStream.js +47 -65
- package/dist/esm/ssr/renderRouterToStream.js.map +1 -1
- package/dist/esm/ssr/renderRouterToString.js +24 -32
- package/dist/esm/ssr/renderRouterToString.js.map +1 -1
- package/dist/esm/ssr/server.js +3 -10
- package/dist/esm/useBlocker.js +243 -287
- package/dist/esm/useBlocker.js.map +1 -1
- package/dist/esm/useCanGoBack.js +6 -5
- package/dist/esm/useCanGoBack.js.map +1 -1
- package/dist/esm/useLoaderData.js +12 -11
- package/dist/esm/useLoaderData.js.map +1 -1
- package/dist/esm/useLoaderDeps.js +12 -14
- package/dist/esm/useLoaderDeps.js.map +1 -1
- package/dist/esm/useLocation.js +6 -7
- package/dist/esm/useLocation.js.map +1 -1
- package/dist/esm/useMatch.js +27 -35
- package/dist/esm/useMatch.js.map +1 -1
- package/dist/esm/useNavigate.js +18 -24
- package/dist/esm/useNavigate.js.map +1 -1
- package/dist/esm/useParams.js +13 -12
- package/dist/esm/useParams.js.map +1 -1
- package/dist/esm/useRouteContext.js +9 -8
- package/dist/esm/useRouteContext.js.map +1 -1
- package/dist/esm/useRouter.js +9 -8
- package/dist/esm/useRouter.js.map +1 -1
- package/dist/esm/useRouterState.js +18 -22
- package/dist/esm/useRouterState.js.map +1 -1
- package/dist/esm/useSearch.js +13 -12
- package/dist/esm/useSearch.js.map +1 -1
- package/dist/esm/utils.js +59 -38
- package/dist/esm/utils.js.map +1 -1
- package/package.json +3 -3
- package/dist/esm/index.dev.js.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/ssr/client.js.map +0 -1
- package/dist/esm/ssr/server.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-restoration.js","sources":["../../src/scroll-restoration.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport {\n defaultGetScrollRestorationKey,\n escapeHtml,\n restoreScroll,\n storageKey,\n} from '@tanstack/router-core'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useRouter } from './useRouter'\nimport { ScriptOnce } from './ScriptOnce'\n\n/**\n * ScrollRestoration component for Vue.\n * On server: renders a ScriptOnce with scroll restoration logic.\n * On client during hydration: renders a matching ScriptOnce to avoid mismatch.\n * After mount: renders nothing.\n */\nexport const ScrollRestoration = Vue.defineComponent({\n name: 'ScrollRestoration',\n setup() {\n const router = useRouter()\n\n // Track mounted state for hydration handling\n const mounted = Vue.ref(false)\n Vue.onMounted(() => {\n mounted.value = true\n })\n\n return () => {\n // After mount, render nothing\n if (mounted.value) {\n return null\n }\n\n // Check if scroll restoration is enabled\n if (!router.isScrollRestoring) {\n return null\n }\n\n // Check custom scroll restoration function\n if (typeof router.options.scrollRestoration === 'function') {\n const shouldRestore = router.options.scrollRestoration({\n location: router.latestLocation,\n })\n if (!shouldRestore) {\n return null\n }\n }\n\n const getKey =\n router.options.getScrollRestorationKey || defaultGetScrollRestorationKey\n const userKey = getKey(router.latestLocation)\n const resolvedKey =\n userKey !== defaultGetScrollRestorationKey(router.latestLocation)\n ? userKey\n : undefined\n\n const restoreScrollOptions: Parameters<typeof restoreScroll>[0] = {\n storageKey,\n shouldScrollRestoration: true,\n }\n if (resolvedKey) {\n restoreScrollOptions.key = resolvedKey\n }\n\n // Server-side: render the actual scroll restoration script\n if (isServer ?? router.isServer) {\n return (\n <ScriptOnce\n children={`(${restoreScroll.toString()})(${escapeHtml(JSON.stringify(restoreScrollOptions))})`}\n />\n )\n }\n\n // Client-side during hydration: render empty ScriptOnce to match server structure\n return <ScriptOnce children=\"\" />\n }\n },\n})\n"],"
|
|
1
|
+
{"version":3,"file":"scroll-restoration.js","names":["Vue","defaultGetScrollRestorationKey","escapeHtml","restoreScroll","storageKey","isServer","useRouter","ScriptOnce","ScrollRestoration","defineComponent","name","setup","router","mounted","ref","onMounted","value","isScrollRestoring","options","scrollRestoration","shouldRestore","location","latestLocation","getKey","getScrollRestorationKey","userKey","resolvedKey","undefined","restoreScrollOptions","shouldScrollRestoration","key","_createVNode","toString","JSON","stringify"],"sources":["../../src/scroll-restoration.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport {\n defaultGetScrollRestorationKey,\n escapeHtml,\n restoreScroll,\n storageKey,\n} from '@tanstack/router-core'\nimport { isServer } from '@tanstack/router-core/isServer'\nimport { useRouter } from './useRouter'\nimport { ScriptOnce } from './ScriptOnce'\n\n/**\n * ScrollRestoration component for Vue.\n * On server: renders a ScriptOnce with scroll restoration logic.\n * On client during hydration: renders a matching ScriptOnce to avoid mismatch.\n * After mount: renders nothing.\n */\nexport const ScrollRestoration = Vue.defineComponent({\n name: 'ScrollRestoration',\n setup() {\n const router = useRouter()\n\n // Track mounted state for hydration handling\n const mounted = Vue.ref(false)\n Vue.onMounted(() => {\n mounted.value = true\n })\n\n return () => {\n // After mount, render nothing\n if (mounted.value) {\n return null\n }\n\n // Check if scroll restoration is enabled\n if (!router.isScrollRestoring) {\n return null\n }\n\n // Check custom scroll restoration function\n if (typeof router.options.scrollRestoration === 'function') {\n const shouldRestore = router.options.scrollRestoration({\n location: router.latestLocation,\n })\n if (!shouldRestore) {\n return null\n }\n }\n\n const getKey =\n router.options.getScrollRestorationKey || defaultGetScrollRestorationKey\n const userKey = getKey(router.latestLocation)\n const resolvedKey =\n userKey !== defaultGetScrollRestorationKey(router.latestLocation)\n ? userKey\n : undefined\n\n const restoreScrollOptions: Parameters<typeof restoreScroll>[0] = {\n storageKey,\n shouldScrollRestoration: true,\n }\n if (resolvedKey) {\n restoreScrollOptions.key = resolvedKey\n }\n\n // Server-side: render the actual scroll restoration script\n if (isServer ?? router.isServer) {\n return (\n <ScriptOnce\n children={`(${restoreScroll.toString()})(${escapeHtml(JSON.stringify(restoreScrollOptions))})`}\n />\n )\n }\n\n // Client-side during hydration: render empty ScriptOnce to match server structure\n return <ScriptOnce children=\"\" />\n }\n },\n})\n"],"mappings":";;;;;;;;;;;;;AAiBA,IAAaQ,oBAAoBR,IAAIS,gBAAgB;CACnDC,MAAM;CACNC,QAAQ;EACN,MAAMC,SAASN,WAAW;EAG1B,MAAMO,UAAUb,IAAIc,IAAI,MAAM;AAC9Bd,MAAIe,gBAAgB;AAClBF,WAAQG,QAAQ;IAChB;AAEF,eAAa;AAEX,OAAIH,QAAQG,MACV,QAAO;AAIT,OAAI,CAACJ,OAAOK,kBACV,QAAO;AAIT,OAAI,OAAOL,OAAOM,QAAQC,sBAAsB;QAI1C,CAHkBP,OAAOM,QAAQC,kBAAkB,EACrDE,UAAUT,OAAOU,gBAClB,CAAC,CAEA,QAAO;;GAMX,MAAMG,WADJb,OAAOM,QAAQM,2BAA2BvB,gCACrBW,OAAOU,eAAe;GAC7C,MAAMI,cACJD,YAAYxB,+BAA+BW,OAAOU,eAAe,GAC7DG,UACAE,KAAAA;GAEN,MAAMC,uBAA4D;IAChExB;IACAyB,yBAAyB;IAC1B;AACD,OAAIH,YACFE,sBAAqBE,MAAMJ;AAI7B,OAAIrB,YAAYO,OAAOP,SACrB,QAAA0B,YAAAxB,YAAA,EAAA,YAEc,IAAIJ,cAAc6B,UAAU,CAAA,IAAK9B,WAAW+B,KAAKC,UAAUN,qBAAqB,CAAC,CAAA,IAAG,EAAA,KAAA;AAMpG,UAAAG,YAAAxB,YAAA,EAAA,YAAA,IAAA,EAAA,KAAA;;;CAGL,CAAC"}
|
|
@@ -1,46 +1,32 @@
|
|
|
1
|
+
import { RouterProvider } from "../RouterProvider.js";
|
|
2
|
+
import { HeadContent } from "../HeadContent.js";
|
|
1
3
|
import * as Vue from "vue";
|
|
2
4
|
import { hydrate } from "@tanstack/router-core/ssr/client";
|
|
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
|
-
if (typeof window === "undefined") {
|
|
29
|
-
isHydrated.value = true;
|
|
30
|
-
}
|
|
31
|
-
return () => {
|
|
32
|
-
if (!isHydrated.value) {
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
return Vue.h(RouterProvider, {
|
|
36
|
-
router: props.router
|
|
37
|
-
}, {
|
|
38
|
-
innerWrap: (innerProps) => [Vue.h(HeadContent), innerProps.children]
|
|
39
|
-
});
|
|
40
|
-
};
|
|
41
|
-
}
|
|
5
|
+
//#region src/ssr/RouterClient.tsx
|
|
6
|
+
var hydrationPromise;
|
|
7
|
+
var RouterClient = Vue.defineComponent({
|
|
8
|
+
name: "RouterClient",
|
|
9
|
+
props: { router: {
|
|
10
|
+
type: Object,
|
|
11
|
+
required: true
|
|
12
|
+
} },
|
|
13
|
+
setup(props) {
|
|
14
|
+
const isHydrated = Vue.ref(false);
|
|
15
|
+
if (!hydrationPromise) if (!props.router.state.matches.length) hydrationPromise = hydrate(props.router);
|
|
16
|
+
else hydrationPromise = Promise.resolve();
|
|
17
|
+
Vue.onMounted(() => {
|
|
18
|
+
hydrationPromise.then(() => {
|
|
19
|
+
isHydrated.value = true;
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
if (typeof window === "undefined") isHydrated.value = true;
|
|
23
|
+
return () => {
|
|
24
|
+
if (!isHydrated.value) return null;
|
|
25
|
+
return Vue.h(RouterProvider, { router: props.router }, { innerWrap: (innerProps) => [Vue.h(HeadContent), innerProps.children] });
|
|
26
|
+
};
|
|
27
|
+
}
|
|
42
28
|
});
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
//# sourceMappingURL=RouterClient.js.map
|
|
29
|
+
//#endregion
|
|
30
|
+
export { RouterClient };
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=RouterClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouterClient.js","sources":["../../../src/ssr/RouterClient.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport { hydrate } from '@tanstack/router-core/ssr/client'\nimport { HeadContent } from '../HeadContent'\nimport { RouterProvider } from '../RouterProvider'\nimport type { AnyRouter } from '@tanstack/router-core'\n\nlet hydrationPromise: Promise<void | Array<Array<void>>> | undefined\n\nexport const RouterClient = Vue.defineComponent({\n name: 'RouterClient',\n props: {\n router: {\n type: Object as () => AnyRouter,\n required: true,\n },\n },\n setup(props) {\n const isHydrated = Vue.ref(false)\n\n if (!hydrationPromise) {\n if (!props.router.state.matches.length) {\n hydrationPromise = hydrate(props.router)\n } else {\n hydrationPromise = Promise.resolve()\n }\n }\n\n Vue.onMounted(() => {\n hydrationPromise!.then(() => {\n isHydrated.value = true\n })\n })\n\n // For SSR, we're already hydrated\n if (typeof window === 'undefined') {\n isHydrated.value = true\n }\n\n return () => {\n if (!isHydrated.value) {\n return null\n }\n\n return Vue.h(\n RouterProvider,\n {\n router: props.router,\n },\n {\n innerWrap: (innerProps: { children: any }) => [\n Vue.h(HeadContent),\n innerProps.children,\n ],\n },\n )\n }\n },\n})\n"],"
|
|
1
|
+
{"version":3,"file":"RouterClient.js","names":["Vue","hydrate","HeadContent","RouterProvider","hydrationPromise","RouterClient","defineComponent","name","props","router","type","Object","required","setup","isHydrated","ref","state","matches","length","Promise","resolve","onMounted","then","value","window","h","innerWrap","innerProps","children"],"sources":["../../../src/ssr/RouterClient.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport { hydrate } from '@tanstack/router-core/ssr/client'\nimport { HeadContent } from '../HeadContent'\nimport { RouterProvider } from '../RouterProvider'\nimport type { AnyRouter } from '@tanstack/router-core'\n\nlet hydrationPromise: Promise<void | Array<Array<void>>> | undefined\n\nexport const RouterClient = Vue.defineComponent({\n name: 'RouterClient',\n props: {\n router: {\n type: Object as () => AnyRouter,\n required: true,\n },\n },\n setup(props) {\n const isHydrated = Vue.ref(false)\n\n if (!hydrationPromise) {\n if (!props.router.state.matches.length) {\n hydrationPromise = hydrate(props.router)\n } else {\n hydrationPromise = Promise.resolve()\n }\n }\n\n Vue.onMounted(() => {\n hydrationPromise!.then(() => {\n isHydrated.value = true\n })\n })\n\n // For SSR, we're already hydrated\n if (typeof window === 'undefined') {\n isHydrated.value = true\n }\n\n return () => {\n if (!isHydrated.value) {\n return null\n }\n\n return Vue.h(\n RouterProvider,\n {\n router: props.router,\n },\n {\n innerWrap: (innerProps: { children: any }) => [\n Vue.h(HeadContent),\n innerProps.children,\n ],\n },\n )\n }\n },\n})\n"],"mappings":";;;;;AAMA,IAAII;AAEJ,IAAaC,eAAeL,IAAIM,gBAAgB;CAC9CC,MAAM;CACNC,OAAO,EACLC,QAAQ;EACNC,MAAMC;EACNC,UAAU;EACZ,EACD;CACDC,MAAML,OAAO;EACX,MAAMM,aAAad,IAAIe,IAAI,MAAM;AAEjC,MAAI,CAACX,iBACH,KAAI,CAACI,MAAMC,OAAOO,MAAMC,QAAQC,OAC9Bd,oBAAmBH,QAAQO,MAAMC,OAAO;MAExCL,oBAAmBe,QAAQC,SAAS;AAIxCpB,MAAIqB,gBAAgB;AAClBjB,oBAAkBkB,WAAW;AAC3BR,eAAWS,QAAQ;KACnB;IACF;AAGF,MAAI,OAAOC,WAAW,YACpBV,YAAWS,QAAQ;AAGrB,eAAa;AACX,OAAI,CAACT,WAAWS,MACd,QAAO;AAGT,UAAOvB,IAAIyB,EACTtB,gBACA,EACEM,QAAQD,MAAMC,QACf,EACD,EACEiB,YAAYC,eAAkC,CAC5C3B,IAAIyB,EAAEvB,YAAY,EAClByB,WAAWC,SAAQ,EAGzB,CAAC;;;CAGN,CAAC"}
|
|
@@ -1,37 +1,34 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { RouterProvider } from "../RouterProvider.js";
|
|
2
2
|
import { Asset } from "../Asset.js";
|
|
3
3
|
import { useTags } from "../headContentUtils.js";
|
|
4
|
-
import { RouterProvider } from "../RouterProvider.js";
|
|
5
4
|
import { Scripts } from "../Scripts.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
5
|
+
import * as Vue from "vue";
|
|
6
|
+
//#region src/ssr/RouterServer.tsx
|
|
7
|
+
var ServerHeadContent = Vue.defineComponent({
|
|
8
|
+
name: "ServerHeadContent",
|
|
9
|
+
setup() {
|
|
10
|
+
const getTags = useTags();
|
|
11
|
+
return () => getTags().map((tag) => Vue.h(Asset, {
|
|
12
|
+
key: tag.tag + tag.id,
|
|
13
|
+
...tag
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
15
16
|
});
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}, {
|
|
30
|
-
innerWrap: (innerProps) => [Vue.h(ServerHeadContent), innerProps.children, Vue.h(Scripts)]
|
|
31
|
-
})])])]);
|
|
32
|
-
}
|
|
17
|
+
var RouterServer = Vue.defineComponent({
|
|
18
|
+
name: "RouterServer",
|
|
19
|
+
props: { router: {
|
|
20
|
+
type: Object,
|
|
21
|
+
required: true
|
|
22
|
+
} },
|
|
23
|
+
setup(props) {
|
|
24
|
+
return () => Vue.h("html", null, [Vue.h("head", null, [Vue.h(ServerHeadContent)]), Vue.h("body", null, [Vue.h("div", { id: "__app" }, [Vue.h(RouterProvider, { router: props.router }, { innerWrap: (innerProps) => [
|
|
25
|
+
Vue.h(ServerHeadContent),
|
|
26
|
+
innerProps.children,
|
|
27
|
+
Vue.h(Scripts)
|
|
28
|
+
] })])])]);
|
|
29
|
+
}
|
|
33
30
|
});
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
//# sourceMappingURL=RouterServer.js.map
|
|
31
|
+
//#endregion
|
|
32
|
+
export { RouterServer };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=RouterServer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouterServer.js","sources":["../../../src/ssr/RouterServer.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport { Asset } from '../Asset'\nimport { useTags } from '../headContentUtils'\nimport { RouterProvider } from '../RouterProvider'\nimport { Scripts } from '../Scripts'\nimport type { AnyRouter, RouterManagedTag } from '@tanstack/router-core'\n\nconst ServerHeadContent = Vue.defineComponent({\n name: 'ServerHeadContent',\n setup() {\n const getTags = useTags()\n\n return () =>\n getTags().map((tag: RouterManagedTag) =>\n Vue.h(Asset, { key: tag.tag + (tag as any).id, ...tag }),\n )\n },\n})\n\nexport const RouterServer = Vue.defineComponent({\n name: 'RouterServer',\n props: {\n router: {\n type: Object as () => AnyRouter,\n required: true,\n },\n },\n setup(props) {\n return () =>\n Vue.h('html', null, [\n Vue.h('head', null, [Vue.h(ServerHeadContent)]),\n Vue.h('body', null, [\n Vue.h('div', { id: '__app' }, [\n Vue.h(\n RouterProvider,\n {\n router: props.router,\n },\n {\n innerWrap: (innerProps: { children: any }) => [\n Vue.h(ServerHeadContent),\n innerProps.children,\n Vue.h(Scripts),\n ],\n },\n ),\n ]),\n ]),\n ])\n },\n})\n"],"
|
|
1
|
+
{"version":3,"file":"RouterServer.js","names":["Vue","Asset","useTags","RouterProvider","Scripts","ServerHeadContent","defineComponent","name","setup","getTags","map","tag","h","key","id","RouterServer","props","router","type","Object","required","innerWrap","innerProps","children"],"sources":["../../../src/ssr/RouterServer.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport { Asset } from '../Asset'\nimport { useTags } from '../headContentUtils'\nimport { RouterProvider } from '../RouterProvider'\nimport { Scripts } from '../Scripts'\nimport type { AnyRouter, RouterManagedTag } from '@tanstack/router-core'\n\nconst ServerHeadContent = Vue.defineComponent({\n name: 'ServerHeadContent',\n setup() {\n const getTags = useTags()\n\n return () =>\n getTags().map((tag: RouterManagedTag) =>\n Vue.h(Asset, { key: tag.tag + (tag as any).id, ...tag }),\n )\n },\n})\n\nexport const RouterServer = Vue.defineComponent({\n name: 'RouterServer',\n props: {\n router: {\n type: Object as () => AnyRouter,\n required: true,\n },\n },\n setup(props) {\n return () =>\n Vue.h('html', null, [\n Vue.h('head', null, [Vue.h(ServerHeadContent)]),\n Vue.h('body', null, [\n Vue.h('div', { id: '__app' }, [\n Vue.h(\n RouterProvider,\n {\n router: props.router,\n },\n {\n innerWrap: (innerProps: { children: any }) => [\n Vue.h(ServerHeadContent),\n innerProps.children,\n Vue.h(Scripts),\n ],\n },\n ),\n ]),\n ]),\n ])\n },\n})\n"],"mappings":";;;;;;AAOA,IAAMK,oBAAoBL,IAAIM,gBAAgB;CAC5CC,MAAM;CACNC,QAAQ;EACN,MAAMC,UAAUP,SAAS;AAEzB,eACEO,SAAS,CAACC,KAAKC,QACbX,IAAIY,EAAEX,OAAO;GAAEY,KAAKF,IAAIA,MAAOA,IAAYG;GAAI,GAAGH;GAAK,CACzD,CAAC;;CAEN,CAAC;AAEF,IAAaI,eAAef,IAAIM,gBAAgB;CAC9CC,MAAM;CACNS,OAAO,EACLC,QAAQ;EACNC,MAAMC;EACNC,UAAU;EACZ,EACD;CACDZ,MAAMQ,OAAO;AACX,eACEhB,IAAIY,EAAE,QAAQ,MAAM,CAClBZ,IAAIY,EAAE,QAAQ,MAAM,CAACZ,IAAIY,EAAEP,kBAAkB,CAAC,CAAC,EAC/CL,IAAIY,EAAE,QAAQ,MAAM,CAClBZ,IAAIY,EAAE,OAAO,EAAEE,IAAI,SAAS,EAAE,CAC5Bd,IAAIY,EACFT,gBACA,EACEc,QAAQD,MAAMC,QACf,EACD,EACEI,YAAYC,eAAkC;GAC5CtB,IAAIY,EAAEP,kBAAkB;GACxBiB,WAAWC;GACXvB,IAAIY,EAAER,QAAQ;GAAA,EAGpB,CAAC,CACF,CAAC,CACH,CAAC,CACH,CAAC;;CAEP,CAAC"}
|
package/dist/esm/ssr/client.js
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
import { defineHandlerCallback } from "@tanstack/router-core/ssr/server";
|
|
2
|
-
import { renderRouterToString } from "./renderRouterToString.js";
|
|
3
1
|
import { RouterServer } from "./RouterServer.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}) => renderRouterToString({
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
2
|
+
import { renderRouterToString } from "./renderRouterToString.js";
|
|
3
|
+
import { defineHandlerCallback } from "@tanstack/router-core/ssr/server";
|
|
4
|
+
//#region src/ssr/defaultRenderHandler.tsx
|
|
5
|
+
var defaultRenderHandler = defineHandlerCallback(({ router, responseHeaders }) => renderRouterToString({
|
|
6
|
+
router,
|
|
7
|
+
responseHeaders,
|
|
8
|
+
App: RouterServer
|
|
11
9
|
}));
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
//# sourceMappingURL=defaultRenderHandler.js.map
|
|
10
|
+
//#endregion
|
|
11
|
+
export { defaultRenderHandler };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=defaultRenderHandler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultRenderHandler.js","sources":["../../../src/ssr/defaultRenderHandler.tsx"],"sourcesContent":["import { defineHandlerCallback } from '@tanstack/router-core/ssr/server'\nimport { renderRouterToString } from './renderRouterToString'\nimport { RouterServer } from './RouterServer'\n\nexport const defaultRenderHandler = defineHandlerCallback(\n ({ router, responseHeaders }) =>\n renderRouterToString({\n router,\n responseHeaders,\n App: RouterServer,\n }),\n)\n"],"
|
|
1
|
+
{"version":3,"file":"defaultRenderHandler.js","names":["defineHandlerCallback","renderRouterToString","RouterServer","defaultRenderHandler","router","responseHeaders","App"],"sources":["../../../src/ssr/defaultRenderHandler.tsx"],"sourcesContent":["import { defineHandlerCallback } from '@tanstack/router-core/ssr/server'\nimport { renderRouterToString } from './renderRouterToString'\nimport { RouterServer } from './RouterServer'\n\nexport const defaultRenderHandler = defineHandlerCallback(\n ({ router, responseHeaders }) =>\n renderRouterToString({\n router,\n responseHeaders,\n App: RouterServer,\n }),\n)\n"],"mappings":";;;;AAIA,IAAaG,uBAAuBH,uBACjC,EAAEI,QAAQC,sBACTJ,qBAAqB;CACnBG;CACAC;CACAC,KAAKJ;CACN,CACL,CAAC"}
|
|
@@ -1,17 +1,14 @@
|
|
|
1
|
-
import { defineHandlerCallback } from "@tanstack/router-core/ssr/server";
|
|
2
|
-
import { renderRouterToStream } from "./renderRouterToStream.js";
|
|
3
1
|
import { RouterServer } from "./RouterServer.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
App: RouterServer
|
|
2
|
+
import { renderRouterToStream } from "./renderRouterToStream.js";
|
|
3
|
+
import { defineHandlerCallback } from "@tanstack/router-core/ssr/server";
|
|
4
|
+
//#region src/ssr/defaultStreamHandler.tsx
|
|
5
|
+
var defaultStreamHandler = defineHandlerCallback(async ({ request, router, responseHeaders }) => await renderRouterToStream({
|
|
6
|
+
request,
|
|
7
|
+
router,
|
|
8
|
+
responseHeaders,
|
|
9
|
+
App: RouterServer
|
|
13
10
|
}));
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
//# sourceMappingURL=defaultStreamHandler.js.map
|
|
11
|
+
//#endregion
|
|
12
|
+
export { defaultStreamHandler };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=defaultStreamHandler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultStreamHandler.js","sources":["../../../src/ssr/defaultStreamHandler.tsx"],"sourcesContent":["import { defineHandlerCallback } from '@tanstack/router-core/ssr/server'\nimport { renderRouterToStream } from './renderRouterToStream'\nimport { RouterServer } from './RouterServer'\n\nexport const defaultStreamHandler = defineHandlerCallback(\n async ({ request, router, responseHeaders }) =>\n await renderRouterToStream({\n request,\n router,\n responseHeaders,\n App: RouterServer,\n }),\n)\n"],"
|
|
1
|
+
{"version":3,"file":"defaultStreamHandler.js","names":["defineHandlerCallback","renderRouterToStream","RouterServer","defaultStreamHandler","request","router","responseHeaders","App"],"sources":["../../../src/ssr/defaultStreamHandler.tsx"],"sourcesContent":["import { defineHandlerCallback } from '@tanstack/router-core/ssr/server'\nimport { renderRouterToStream } from './renderRouterToStream'\nimport { RouterServer } from './RouterServer'\n\nexport const defaultStreamHandler = defineHandlerCallback(\n async ({ request, router, responseHeaders }) =>\n await renderRouterToStream({\n request,\n router,\n responseHeaders,\n App: RouterServer,\n }),\n)\n"],"mappings":";;;;AAIA,IAAaG,uBAAuBH,sBAClC,OAAO,EAAEI,SAASC,QAAQC,sBACxB,MAAML,qBAAqB;CACzBG;CACAC;CACAC;CACAC,KAAKL;CACN,CACL,CAAC"}
|
|
@@ -1,70 +1,52 @@
|
|
|
1
|
-
import { ReadableStream } from "node:stream/web";
|
|
2
1
|
import * as Vue from "vue";
|
|
3
|
-
import { renderToString, pipeToWebWritable } from "vue/server-renderer";
|
|
4
|
-
import { isbot } from "isbot";
|
|
5
2
|
import { transformReadableStreamWithRouter } from "@tanstack/router-core/ssr/server";
|
|
3
|
+
import { pipeToWebWritable, renderToString } from "vue/server-renderer";
|
|
4
|
+
import { ReadableStream } from "node:stream/web";
|
|
5
|
+
import { isbot } from "isbot";
|
|
6
|
+
//#region src/ssr/renderRouterToStream.tsx
|
|
6
7
|
function prependDoctype(readable) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return pump();
|
|
27
|
-
}
|
|
28
|
-
pump().catch((err) => controller.error(err));
|
|
29
|
-
}
|
|
30
|
-
});
|
|
8
|
+
const encoder = new TextEncoder();
|
|
9
|
+
let sentDoctype = false;
|
|
10
|
+
return new ReadableStream({ start(controller) {
|
|
11
|
+
const reader = readable.getReader();
|
|
12
|
+
async function pump() {
|
|
13
|
+
const { done, value } = await reader.read();
|
|
14
|
+
if (done) {
|
|
15
|
+
controller.close();
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (!sentDoctype) {
|
|
19
|
+
sentDoctype = true;
|
|
20
|
+
controller.enqueue(encoder.encode("<!DOCTYPE html>"));
|
|
21
|
+
}
|
|
22
|
+
controller.enqueue(value);
|
|
23
|
+
return pump();
|
|
24
|
+
}
|
|
25
|
+
pump().catch((err) => controller.error(err));
|
|
26
|
+
} });
|
|
31
27
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
headers: responseHeaders
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
const {
|
|
56
|
-
writable,
|
|
57
|
-
readable
|
|
58
|
-
} = new TransformStream();
|
|
59
|
-
pipeToWebWritable(app, {}, writable);
|
|
60
|
-
const doctypedStream = prependDoctype(readable);
|
|
61
|
-
const responseStream = transformReadableStreamWithRouter(router, doctypedStream);
|
|
62
|
-
return new Response(responseStream, {
|
|
63
|
-
status: router.state.statusCode,
|
|
64
|
-
headers: responseHeaders
|
|
65
|
-
});
|
|
66
|
-
};
|
|
67
|
-
export {
|
|
68
|
-
renderRouterToStream
|
|
28
|
+
var renderRouterToStream = async ({ request, router, responseHeaders, App }) => {
|
|
29
|
+
const app = Vue.createSSRApp(App, { router });
|
|
30
|
+
if (isbot(request.headers.get("User-Agent"))) {
|
|
31
|
+
let fullHtml = await renderToString(app);
|
|
32
|
+
const htmlOpenIndex = fullHtml.indexOf("<html");
|
|
33
|
+
const htmlCloseIndex = fullHtml.indexOf("</html>");
|
|
34
|
+
if (htmlOpenIndex !== -1 && htmlCloseIndex !== -1) fullHtml = fullHtml.slice(htmlOpenIndex, htmlCloseIndex + 7);
|
|
35
|
+
else if (htmlOpenIndex !== -1) fullHtml = fullHtml.slice(htmlOpenIndex);
|
|
36
|
+
return new Response(`<!DOCTYPE html>${fullHtml}`, {
|
|
37
|
+
status: router.state.statusCode,
|
|
38
|
+
headers: responseHeaders
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const { writable, readable } = new TransformStream();
|
|
42
|
+
pipeToWebWritable(app, {}, writable);
|
|
43
|
+
const responseStream = transformReadableStreamWithRouter(router, prependDoctype(readable));
|
|
44
|
+
return new Response(responseStream, {
|
|
45
|
+
status: router.state.statusCode,
|
|
46
|
+
headers: responseHeaders
|
|
47
|
+
});
|
|
69
48
|
};
|
|
70
|
-
//#
|
|
49
|
+
//#endregion
|
|
50
|
+
export { renderRouterToStream };
|
|
51
|
+
|
|
52
|
+
//# sourceMappingURL=renderRouterToStream.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderRouterToStream.js","sources":["../../../src/ssr/renderRouterToStream.tsx"],"sourcesContent":["import { ReadableStream as NodeReadableStream } from 'node:stream/web'\nimport * as Vue from 'vue'\nimport { pipeToWebWritable, renderToString } from 'vue/server-renderer'\nimport { isbot } from 'isbot'\nimport { transformReadableStreamWithRouter } from '@tanstack/router-core/ssr/server'\nimport type { AnyRouter } from '@tanstack/router-core'\nimport type { Component } from 'vue'\n\nfunction prependDoctype(\n readable: globalThis.ReadableStream,\n): NodeReadableStream<Uint8Array> {\n const encoder = new TextEncoder()\n let sentDoctype = false\n\n return new NodeReadableStream<Uint8Array>({\n start(controller) {\n const reader = readable.getReader()\n\n async function pump(): Promise<void> {\n const { done, value } = await reader.read()\n if (done) {\n controller.close()\n return\n }\n\n if (!sentDoctype) {\n sentDoctype = true\n controller.enqueue(encoder.encode('<!DOCTYPE html>'))\n }\n controller.enqueue(value)\n return pump()\n }\n\n pump().catch((err) => controller.error(err))\n },\n })\n}\n\nexport const renderRouterToStream = async ({\n request,\n router,\n responseHeaders,\n App,\n}: {\n request: Request\n router: AnyRouter\n responseHeaders: Headers\n App: Component\n}) => {\n const app = Vue.createSSRApp(App, { router })\n\n if (isbot(request.headers.get('User-Agent'))) {\n let fullHtml = await renderToString(app)\n\n const htmlOpenIndex = fullHtml.indexOf('<html')\n const htmlCloseIndex = fullHtml.indexOf('</html>')\n\n if (htmlOpenIndex !== -1 && htmlCloseIndex !== -1) {\n fullHtml = fullHtml.slice(htmlOpenIndex, htmlCloseIndex + 7)\n } else if (htmlOpenIndex !== -1) {\n fullHtml = fullHtml.slice(htmlOpenIndex)\n }\n\n return new Response(`<!DOCTYPE html>${fullHtml}`, {\n status: router.state.statusCode,\n headers: responseHeaders,\n })\n }\n\n const { writable, readable } = new TransformStream()\n\n pipeToWebWritable(app, {}, writable)\n\n const doctypedStream = prependDoctype(readable)\n const responseStream = transformReadableStreamWithRouter(\n router,\n doctypedStream,\n )\n\n return new Response(responseStream as any, {\n status: router.state.statusCode,\n headers: responseHeaders,\n })\n}\n"],"
|
|
1
|
+
{"version":3,"file":"renderRouterToStream.js","names":["ReadableStream","NodeReadableStream","Vue","pipeToWebWritable","renderToString","isbot","transformReadableStreamWithRouter","prependDoctype","readable","encoder","TextEncoder","sentDoctype","start","controller","reader","getReader","pump","done","value","read","close","enqueue","encode","catch","err","error","renderRouterToStream","request","router","responseHeaders","App","app","createSSRApp","headers","get","fullHtml","htmlOpenIndex","indexOf","htmlCloseIndex","slice","Response","status","state","statusCode","writable","TransformStream","doctypedStream","responseStream"],"sources":["../../../src/ssr/renderRouterToStream.tsx"],"sourcesContent":["import { ReadableStream as NodeReadableStream } from 'node:stream/web'\nimport * as Vue from 'vue'\nimport { pipeToWebWritable, renderToString } from 'vue/server-renderer'\nimport { isbot } from 'isbot'\nimport { transformReadableStreamWithRouter } from '@tanstack/router-core/ssr/server'\nimport type { AnyRouter } from '@tanstack/router-core'\nimport type { Component } from 'vue'\n\nfunction prependDoctype(\n readable: globalThis.ReadableStream,\n): NodeReadableStream<Uint8Array> {\n const encoder = new TextEncoder()\n let sentDoctype = false\n\n return new NodeReadableStream<Uint8Array>({\n start(controller) {\n const reader = readable.getReader()\n\n async function pump(): Promise<void> {\n const { done, value } = await reader.read()\n if (done) {\n controller.close()\n return\n }\n\n if (!sentDoctype) {\n sentDoctype = true\n controller.enqueue(encoder.encode('<!DOCTYPE html>'))\n }\n controller.enqueue(value)\n return pump()\n }\n\n pump().catch((err) => controller.error(err))\n },\n })\n}\n\nexport const renderRouterToStream = async ({\n request,\n router,\n responseHeaders,\n App,\n}: {\n request: Request\n router: AnyRouter\n responseHeaders: Headers\n App: Component\n}) => {\n const app = Vue.createSSRApp(App, { router })\n\n if (isbot(request.headers.get('User-Agent'))) {\n let fullHtml = await renderToString(app)\n\n const htmlOpenIndex = fullHtml.indexOf('<html')\n const htmlCloseIndex = fullHtml.indexOf('</html>')\n\n if (htmlOpenIndex !== -1 && htmlCloseIndex !== -1) {\n fullHtml = fullHtml.slice(htmlOpenIndex, htmlCloseIndex + 7)\n } else if (htmlOpenIndex !== -1) {\n fullHtml = fullHtml.slice(htmlOpenIndex)\n }\n\n return new Response(`<!DOCTYPE html>${fullHtml}`, {\n status: router.state.statusCode,\n headers: responseHeaders,\n })\n }\n\n const { writable, readable } = new TransformStream()\n\n pipeToWebWritable(app, {}, writable)\n\n const doctypedStream = prependDoctype(readable)\n const responseStream = transformReadableStreamWithRouter(\n router,\n doctypedStream,\n )\n\n return new Response(responseStream as any, {\n status: router.state.statusCode,\n headers: responseHeaders,\n })\n}\n"],"mappings":";;;;;;AAQA,SAASO,eACPC,UACgC;CAChC,MAAMC,UAAU,IAAIC,aAAa;CACjC,IAAIC,cAAc;AAElB,QAAO,IAAIV,eAA+B,EACxCW,MAAMC,YAAY;EAChB,MAAMC,SAASN,SAASO,WAAW;EAEnC,eAAeC,OAAsB;GACnC,MAAM,EAAEC,MAAMC,UAAU,MAAMJ,OAAOK,MAAM;AAC3C,OAAIF,MAAM;AACRJ,eAAWO,OAAO;AAClB;;AAGF,OAAI,CAACT,aAAa;AAChBA,kBAAc;AACdE,eAAWQ,QAAQZ,QAAQa,OAAO,kBAAkB,CAAC;;AAEvDT,cAAWQ,QAAQH,MAAM;AACzB,UAAOF,MAAM;;AAGfA,QAAM,CAACO,OAAOC,QAAQX,WAAWY,MAAMD,IAAI,CAAC;IAE/C,CAAC;;AAGJ,IAAaE,uBAAuB,OAAO,EACzCC,SACAC,QACAC,iBACAC,UAMI;CACJ,MAAMC,MAAM7B,IAAI8B,aAAaF,KAAK,EAAEF,QAAQ,CAAC;AAE7C,KAAIvB,MAAMsB,QAAQM,QAAQC,IAAI,aAAa,CAAC,EAAE;EAC5C,IAAIC,WAAW,MAAM/B,eAAe2B,IAAI;EAExC,MAAMK,gBAAgBD,SAASE,QAAQ,QAAQ;EAC/C,MAAMC,iBAAiBH,SAASE,QAAQ,UAAU;AAElD,MAAID,kBAAkB,MAAME,mBAAmB,GAC7CH,YAAWA,SAASI,MAAMH,eAAeE,iBAAiB,EAAE;WACnDF,kBAAkB,GAC3BD,YAAWA,SAASI,MAAMH,cAAc;AAG1C,SAAO,IAAII,SAAS,kBAAkBL,YAAY;GAChDM,QAAQb,OAAOc,MAAMC;GACrBV,SAASJ;GACV,CAAC;;CAGJ,MAAM,EAAEe,UAAUpC,aAAa,IAAIqC,iBAAiB;AAEpD1C,mBAAkB4B,KAAK,EAAE,EAAEa,SAAS;CAGpC,MAAMG,iBAAiBzC,kCACrBsB,QAFqBrB,eAAeC,SAAS,CAI9C;AAED,QAAO,IAAIgC,SAASO,gBAAuB;EACzCN,QAAQb,OAAOc,MAAMC;EACrBV,SAASJ;EACV,CAAC"}
|
|
@@ -1,35 +1,27 @@
|
|
|
1
1
|
import * as Vue from "vue";
|
|
2
2
|
import { renderToString } from "vue/server-renderer";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
console.error("Render to string error:", error);
|
|
24
|
-
return new Response("Internal Server Error", {
|
|
25
|
-
status: 500,
|
|
26
|
-
headers: responseHeaders
|
|
27
|
-
});
|
|
28
|
-
} finally {
|
|
29
|
-
router.serverSsr?.cleanup();
|
|
30
|
-
}
|
|
3
|
+
//#region src/ssr/renderRouterToString.tsx
|
|
4
|
+
var renderRouterToString = async ({ router, responseHeaders, App }) => {
|
|
5
|
+
try {
|
|
6
|
+
let html = await renderToString(Vue.createSSRApp(App, { router }));
|
|
7
|
+
router.serverSsr.setRenderFinished();
|
|
8
|
+
const injectedHtml = router.serverSsr.takeBufferedHtml();
|
|
9
|
+
if (injectedHtml) html = html.replace(`</body>`, () => `${injectedHtml}</body>`);
|
|
10
|
+
return new Response(`<!DOCTYPE html>${html}`, {
|
|
11
|
+
status: router.state.statusCode,
|
|
12
|
+
headers: responseHeaders
|
|
13
|
+
});
|
|
14
|
+
} catch (error) {
|
|
15
|
+
console.error("Render to string error:", error);
|
|
16
|
+
return new Response("Internal Server Error", {
|
|
17
|
+
status: 500,
|
|
18
|
+
headers: responseHeaders
|
|
19
|
+
});
|
|
20
|
+
} finally {
|
|
21
|
+
router.serverSsr?.cleanup();
|
|
22
|
+
}
|
|
31
23
|
};
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
//# sourceMappingURL=renderRouterToString.js.map
|
|
24
|
+
//#endregion
|
|
25
|
+
export { renderRouterToString };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=renderRouterToString.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderRouterToString.js","sources":["../../../src/ssr/renderRouterToString.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport { renderToString as vueRenderToString } from 'vue/server-renderer'\nimport type { AnyRouter } from '@tanstack/router-core'\nimport type { Component } from 'vue'\n\nexport const renderRouterToString = async ({\n router,\n responseHeaders,\n App,\n}: {\n router: AnyRouter\n responseHeaders: Headers\n App: Component\n}) => {\n try {\n const app = Vue.createSSRApp(App, { router })\n\n let html = await vueRenderToString(app)\n router.serverSsr!.setRenderFinished()\n\n const injectedHtml = router.serverSsr!.takeBufferedHtml()\n if (injectedHtml) {\n html = html.replace(`</body>`, () => `${injectedHtml}</body>`)\n }\n\n return new Response(`<!DOCTYPE html>${html}`, {\n status: router.state.statusCode,\n headers: responseHeaders,\n })\n } catch (error) {\n console.error('Render to string error:', error)\n return new Response('Internal Server Error', {\n status: 500,\n headers: responseHeaders,\n })\n } finally {\n router.serverSsr?.cleanup()\n }\n}\n"],"
|
|
1
|
+
{"version":3,"file":"renderRouterToString.js","names":["Vue","renderToString","vueRenderToString","renderRouterToString","router","responseHeaders","App","app","createSSRApp","html","serverSsr","setRenderFinished","injectedHtml","takeBufferedHtml","replace","Response","status","state","statusCode","headers","error","console","cleanup"],"sources":["../../../src/ssr/renderRouterToString.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport { renderToString as vueRenderToString } from 'vue/server-renderer'\nimport type { AnyRouter } from '@tanstack/router-core'\nimport type { Component } from 'vue'\n\nexport const renderRouterToString = async ({\n router,\n responseHeaders,\n App,\n}: {\n router: AnyRouter\n responseHeaders: Headers\n App: Component\n}) => {\n try {\n const app = Vue.createSSRApp(App, { router })\n\n let html = await vueRenderToString(app)\n router.serverSsr!.setRenderFinished()\n\n const injectedHtml = router.serverSsr!.takeBufferedHtml()\n if (injectedHtml) {\n html = html.replace(`</body>`, () => `${injectedHtml}</body>`)\n }\n\n return new Response(`<!DOCTYPE html>${html}`, {\n status: router.state.statusCode,\n headers: responseHeaders,\n })\n } catch (error) {\n console.error('Render to string error:', error)\n return new Response('Internal Server Error', {\n status: 500,\n headers: responseHeaders,\n })\n } finally {\n router.serverSsr?.cleanup()\n }\n}\n"],"mappings":";;;AAKA,IAAaG,uBAAuB,OAAO,EACzCC,QACAC,iBACAC,UAKI;AACJ,KAAI;EAGF,IAAIG,OAAO,MAAMP,eAFLF,IAAIQ,aAAaF,KAAK,EAAEF,QAAQ,CAAC,CAEN;AACvCA,SAAOM,UAAWC,mBAAmB;EAErC,MAAMC,eAAeR,OAAOM,UAAWG,kBAAkB;AACzD,MAAID,aACFH,QAAOA,KAAKK,QAAQ,iBAAiB,GAAGF,aAAY,SAAU;AAGhE,SAAO,IAAIG,SAAS,kBAAkBN,QAAQ;GAC5CO,QAAQZ,OAAOa,MAAMC;GACrBC,SAASd;GACV,CAAC;UACKe,OAAO;AACdC,UAAQD,MAAM,2BAA2BA,MAAM;AAC/C,SAAO,IAAIL,SAAS,yBAAyB;GAC3CC,QAAQ;GACRG,SAASd;GACV,CAAC;WACM;AACRD,SAAOM,WAAWY,SAAS"}
|
package/dist/esm/ssr/server.js
CHANGED
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
import { RouterServer } from "./RouterServer.js";
|
|
2
|
+
import { renderRouterToString } from "./renderRouterToString.js";
|
|
2
3
|
import { defaultRenderHandler } from "./defaultRenderHandler.js";
|
|
3
|
-
import { defaultStreamHandler } from "./defaultStreamHandler.js";
|
|
4
4
|
import { renderRouterToStream } from "./renderRouterToStream.js";
|
|
5
|
-
import {
|
|
5
|
+
import { defaultStreamHandler } from "./defaultStreamHandler.js";
|
|
6
6
|
export * from "@tanstack/router-core/ssr/server";
|
|
7
|
-
export {
|
|
8
|
-
RouterServer,
|
|
9
|
-
defaultRenderHandler,
|
|
10
|
-
defaultStreamHandler,
|
|
11
|
-
renderRouterToStream,
|
|
12
|
-
renderRouterToString
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=server.js.map
|
|
7
|
+
export { RouterServer, defaultRenderHandler, defaultStreamHandler, renderRouterToStream, renderRouterToString };
|