@tanstack/vue-router 1.168.2 → 1.168.4
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/HeadContent.d.ts +18 -2
- package/dist/esm/HeadContent.dev.d.ts +15 -2
- package/dist/esm/HeadContent.dev.js +6 -2
- package/dist/esm/HeadContent.dev.js.map +1 -1
- package/dist/esm/HeadContent.js +6 -2
- package/dist/esm/HeadContent.js.map +1 -1
- package/dist/esm/headContentUtils.d.ts +2 -2
- package/dist/esm/headContentUtils.js +9 -4
- package/dist/esm/headContentUtils.js.map +1 -1
- package/dist/esm/useLoaderDeps.d.ts +3 -2
- package/dist/esm/useLoaderDeps.js.map +1 -1
- package/dist/source/HeadContent.d.ts +18 -2
- package/dist/source/HeadContent.dev.d.ts +15 -2
- package/dist/source/HeadContent.dev.jsx +8 -2
- package/dist/source/HeadContent.dev.jsx.map +1 -1
- package/dist/source/HeadContent.jsx +8 -2
- package/dist/source/HeadContent.jsx.map +1 -1
- package/dist/source/headContentUtils.d.ts +2 -2
- package/dist/source/headContentUtils.jsx +11 -4
- package/dist/source/headContentUtils.jsx.map +1 -1
- package/dist/source/useLoaderDeps.d.ts +3 -2
- package/dist/source/useLoaderDeps.jsx.map +1 -1
- package/package.json +5 -4
- package/src/HeadContent.dev.tsx +9 -2
- package/src/HeadContent.tsx +13 -2
- package/src/headContentUtils.tsx +21 -5
- package/src/useLoaderDeps.tsx +4 -3
|
@@ -1,8 +1,24 @@
|
|
|
1
|
+
import { AssetCrossOriginConfig } from '@tanstack/router-core';
|
|
1
2
|
import * as Vue from 'vue';
|
|
3
|
+
export interface HeadContentProps {
|
|
4
|
+
assetCrossOrigin?: AssetCrossOriginConfig;
|
|
5
|
+
}
|
|
2
6
|
/**
|
|
3
7
|
* @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.
|
|
4
8
|
* It should be rendered in the `<head>` of your document.
|
|
5
9
|
*/
|
|
6
|
-
export declare const HeadContent: Vue.DefineComponent<
|
|
10
|
+
export declare const HeadContent: Vue.DefineComponent<Vue.ExtractPropTypes<{
|
|
11
|
+
assetCrossOrigin: {
|
|
12
|
+
type: Vue.PropType<AssetCrossOriginConfig>;
|
|
13
|
+
default: undefined;
|
|
14
|
+
};
|
|
15
|
+
}>, () => Vue.VNode<Vue.RendererNode, Vue.RendererElement, {
|
|
7
16
|
[key: string]: any;
|
|
8
|
-
}>[], {}, {}, {}, Vue.ComponentOptionsMixin, Vue.ComponentOptionsMixin, {}, string, Vue.PublicProps, Readonly<
|
|
17
|
+
}>[], {}, {}, {}, Vue.ComponentOptionsMixin, Vue.ComponentOptionsMixin, {}, string, Vue.PublicProps, Readonly<Vue.ExtractPropTypes<{
|
|
18
|
+
assetCrossOrigin: {
|
|
19
|
+
type: Vue.PropType<AssetCrossOriginConfig>;
|
|
20
|
+
default: undefined;
|
|
21
|
+
};
|
|
22
|
+
}>> & Readonly<{}>, {
|
|
23
|
+
assetCrossOrigin: AssetCrossOriginConfig;
|
|
24
|
+
}, {}, {}, {}, string, Vue.ComponentProvideOptions, true, {}, any>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AssetCrossOriginConfig } from '@tanstack/router-core';
|
|
1
2
|
import * as Vue from 'vue';
|
|
2
3
|
/**
|
|
3
4
|
* @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.
|
|
@@ -5,6 +6,18 @@ import * as Vue from 'vue';
|
|
|
5
6
|
*
|
|
6
7
|
* This is the development version that filters out dev styles after hydration.
|
|
7
8
|
*/
|
|
8
|
-
export declare const HeadContent: Vue.DefineComponent<
|
|
9
|
+
export declare const HeadContent: Vue.DefineComponent<Vue.ExtractPropTypes<{
|
|
10
|
+
assetCrossOrigin: {
|
|
11
|
+
type: Vue.PropType<AssetCrossOriginConfig>;
|
|
12
|
+
default: undefined;
|
|
13
|
+
};
|
|
14
|
+
}>, () => Vue.VNode<Vue.RendererNode, Vue.RendererElement, {
|
|
9
15
|
[key: string]: any;
|
|
10
|
-
}>[], {}, {}, {}, Vue.ComponentOptionsMixin, Vue.ComponentOptionsMixin, {}, string, Vue.PublicProps, Readonly<
|
|
16
|
+
}>[], {}, {}, {}, Vue.ComponentOptionsMixin, Vue.ComponentOptionsMixin, {}, string, Vue.PublicProps, Readonly<Vue.ExtractPropTypes<{
|
|
17
|
+
assetCrossOrigin: {
|
|
18
|
+
type: Vue.PropType<AssetCrossOriginConfig>;
|
|
19
|
+
default: undefined;
|
|
20
|
+
};
|
|
21
|
+
}>> & Readonly<{}>, {
|
|
22
|
+
assetCrossOrigin: AssetCrossOriginConfig;
|
|
23
|
+
}, {}, {}, {}, string, Vue.ComponentProvideOptions, true, {}, any>;
|
|
@@ -12,8 +12,12 @@ var DEV_STYLES_ATTR = "data-tanstack-router-dev-styles";
|
|
|
12
12
|
*/
|
|
13
13
|
var HeadContent = Vue.defineComponent({
|
|
14
14
|
name: "HeadContent",
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
props: { assetCrossOrigin: {
|
|
16
|
+
type: [String, Object],
|
|
17
|
+
default: void 0
|
|
18
|
+
} },
|
|
19
|
+
setup(props) {
|
|
20
|
+
const tags = useTags(props.assetCrossOrigin);
|
|
17
21
|
const hydrated = useHydrated();
|
|
18
22
|
Vue.onMounted(() => {
|
|
19
23
|
document.querySelectorAll(`link[${DEV_STYLES_ATTR}]`).forEach((el) => el.remove());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadContent.dev.js","names":["Vue","Asset","useHydrated","useTags","DEV_STYLES_ATTR","HeadContent","defineComponent","name","setup","tags","hydrated","onMounted","document","querySelectorAll","forEach","el","remove","filteredTags","value","filter","tag","attrs","map","h","key","JSON","stringify"],"sources":["../../src/HeadContent.dev.tsx"],"sourcesContent":["import * as Vue from 'vue'\n\nimport { Asset } from './Asset'\nimport { useHydrated } from './ClientOnly'\nimport { useTags } from './headContentUtils'\n\nconst DEV_STYLES_ATTR = 'data-tanstack-router-dev-styles'\n\n/**\n * @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.\n * It should be rendered in the `<head>` of your document.\n *\n * This is the development version that filters out dev styles after hydration.\n */\nexport const HeadContent = Vue.defineComponent({\n name: 'HeadContent',\n setup() {\n const tags = useTags()\n const hydrated = useHydrated()\n\n // Fallback cleanup for hydration mismatch cases\n Vue.onMounted(() => {\n document\n .querySelectorAll(`link[${DEV_STYLES_ATTR}]`)\n .forEach((el) => el.remove())\n })\n\n return () => {\n // Filter out dev styles after hydration\n const filteredTags = hydrated.value\n ? tags().filter((tag) => !tag.attrs?.[DEV_STYLES_ATTR])\n : tags()\n\n return filteredTags.map((tag) =>\n Vue.h(Asset, {\n ...tag,\n key: `tsr-meta-${JSON.stringify(tag)}`,\n }),\n )\n }\n },\n})\n"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"HeadContent.dev.js","names":["Vue","Asset","useHydrated","useTags","DEV_STYLES_ATTR","HeadContent","defineComponent","name","props","assetCrossOrigin","type","String","Object","default","undefined","setup","tags","hydrated","onMounted","document","querySelectorAll","forEach","el","remove","filteredTags","value","filter","tag","attrs","map","h","key","JSON","stringify"],"sources":["../../src/HeadContent.dev.tsx"],"sourcesContent":["import * as Vue from 'vue'\n\nimport { Asset } from './Asset'\nimport { useHydrated } from './ClientOnly'\nimport { useTags } from './headContentUtils'\nimport type { AssetCrossOriginConfig } from '@tanstack/router-core'\n\nconst DEV_STYLES_ATTR = 'data-tanstack-router-dev-styles'\n\n/**\n * @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.\n * It should be rendered in the `<head>` of your document.\n *\n * This is the development version that filters out dev styles after hydration.\n */\nexport const HeadContent = Vue.defineComponent({\n name: 'HeadContent',\n props: {\n assetCrossOrigin: {\n type: [String, Object] as Vue.PropType<AssetCrossOriginConfig>,\n default: undefined,\n },\n },\n setup(props) {\n const tags = useTags(props.assetCrossOrigin)\n const hydrated = useHydrated()\n\n // Fallback cleanup for hydration mismatch cases\n Vue.onMounted(() => {\n document\n .querySelectorAll(`link[${DEV_STYLES_ATTR}]`)\n .forEach((el) => el.remove())\n })\n\n return () => {\n // Filter out dev styles after hydration\n const filteredTags = hydrated.value\n ? tags().filter((tag) => !tag.attrs?.[DEV_STYLES_ATTR])\n : tags()\n\n return filteredTags.map((tag) =>\n Vue.h(Asset, {\n ...tag,\n key: `tsr-meta-${JSON.stringify(tag)}`,\n }),\n )\n }\n },\n})\n"],"mappings":";;;;;AAOA,IAAMI,kBAAkB;;;;;;;AAQxB,IAAaC,cAAcL,IAAIM,gBAAgB;CAC7CC,MAAM;CACNC,OAAO,EACLC,kBAAkB;EAChBC,MAAM,CAACC,QAAQC,OAA+C;EAC9DC,SAASC,KAAAA;EACX,EACD;CACDC,MAAMP,OAAO;EACX,MAAMQ,OAAOb,QAAQK,MAAMC,iBAAiB;EAC5C,MAAMQ,WAAWf,aAAa;AAG9BF,MAAIkB,gBAAgB;AAClBC,YACGC,iBAAiB,QAAQhB,gBAAe,GAAI,CAC5CiB,SAASC,OAAOA,GAAGC,QAAQ,CAAC;IAC/B;AAEF,eAAa;AAMX,WAJqBN,SAASQ,QAC1BT,MAAM,CAACU,QAAQC,QAAQ,CAACA,IAAIC,QAAQxB,iBAAiB,GACrDY,MAAM,EAEUa,KAAKF,QACvB3B,IAAI8B,EAAE7B,OAAO;IACX,GAAG0B;IACHI,KAAK,YAAYC,KAAKC,UAAUN,IAAI;IACrC,CACH,CAAC;;;CAGN,CAAC"}
|
package/dist/esm/HeadContent.js
CHANGED
|
@@ -8,8 +8,12 @@ import * as Vue from "vue";
|
|
|
8
8
|
*/
|
|
9
9
|
var HeadContent = Vue.defineComponent({
|
|
10
10
|
name: "HeadContent",
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
props: { assetCrossOrigin: {
|
|
12
|
+
type: [String, Object],
|
|
13
|
+
default: void 0
|
|
14
|
+
} },
|
|
15
|
+
setup(props) {
|
|
16
|
+
const tags = useTags(props.assetCrossOrigin);
|
|
13
17
|
return () => {
|
|
14
18
|
return tags().map((tag) => Vue.h(Asset, {
|
|
15
19
|
...tag,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadContent.js","names":["Vue","Asset","useTags","HeadContent","defineComponent","name","setup","tags","map","tag","h","key","JSON","stringify"],"sources":["../../src/HeadContent.tsx"],"sourcesContent":["import * as Vue from 'vue'\n\nimport { Asset } from './Asset'\nimport { useTags } from './headContentUtils'\n\n/**\n * @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.\n * It should be rendered in the `<head>` of your document.\n */\nexport const HeadContent = Vue.defineComponent({\n name: 'HeadContent',\n setup() {\n const tags = useTags()\n\n return () => {\n return tags().map((tag) =>\n Vue.h(Asset, {\n ...tag,\n key: `tsr-meta-${JSON.stringify(tag)}`,\n }),\n )\n }\n },\n})\n"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"HeadContent.js","names":["Vue","Asset","useTags","HeadContent","defineComponent","name","props","assetCrossOrigin","type","String","Object","default","undefined","setup","tags","map","tag","h","key","JSON","stringify"],"sources":["../../src/HeadContent.tsx"],"sourcesContent":["import * as Vue from 'vue'\n\nimport { Asset } from './Asset'\nimport { useTags } from './headContentUtils'\nimport type { AssetCrossOriginConfig } from '@tanstack/router-core'\n\nexport interface HeadContentProps {\n assetCrossOrigin?: AssetCrossOriginConfig\n}\n\n/**\n * @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.\n * It should be rendered in the `<head>` of your document.\n */\nexport const HeadContent = Vue.defineComponent({\n name: 'HeadContent',\n props: {\n assetCrossOrigin: {\n type: [String, Object] as Vue.PropType<AssetCrossOriginConfig>,\n default: undefined,\n },\n },\n setup(props) {\n const tags = useTags(props.assetCrossOrigin)\n\n return () => {\n return tags().map((tag) =>\n Vue.h(Asset, {\n ...tag,\n key: `tsr-meta-${JSON.stringify(tag)}`,\n }),\n )\n }\n },\n})\n"],"mappings":";;;;;;;;AAcA,IAAaG,cAAcH,IAAII,gBAAgB;CAC7CC,MAAM;CACNC,OAAO,EACLC,kBAAkB;EAChBC,MAAM,CAACC,QAAQC,OAA+C;EAC9DC,SAASC,KAAAA;EACX,EACD;CACDC,MAAMP,OAAO;EACX,MAAMQ,OAAOZ,QAAQI,MAAMC,iBAAiB;AAE5C,eAAa;AACX,UAAOO,MAAM,CAACC,KAAKC,QACjBhB,IAAIiB,EAAEhB,OAAO;IACX,GAAGe;IACHE,KAAK,YAAYC,KAAKC,UAAUJ,IAAI;IACrC,CACH,CAAC;;;CAGN,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { RouterManagedTag } from '@tanstack/router-core';
|
|
2
|
-
export declare const useTags: () => () => RouterManagedTag[];
|
|
1
|
+
import { AssetCrossOriginConfig, RouterManagedTag } from '@tanstack/router-core';
|
|
2
|
+
export declare const useTags: (assetCrossOrigin?: AssetCrossOriginConfig) => () => RouterManagedTag[];
|
|
3
3
|
export declare function uniqBy<T>(arr: Array<T>, fn: (item: T) => string): T[];
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { useRouter } from "./useRouter.js";
|
|
2
|
-
import { escapeHtml } from "@tanstack/router-core";
|
|
2
|
+
import { escapeHtml, getAssetCrossOrigin, resolveManifestAssetLink } from "@tanstack/router-core";
|
|
3
3
|
import * as Vue from "vue";
|
|
4
4
|
import { useStore } from "@tanstack/vue-store";
|
|
5
5
|
//#region src/headContentUtils.tsx
|
|
6
|
-
var useTags = () => {
|
|
6
|
+
var useTags = (assetCrossOrigin) => {
|
|
7
7
|
const router = useRouter();
|
|
8
8
|
const matches = useStore(router.stores.activeMatchesSnapshot, (value) => value);
|
|
9
9
|
const meta = Vue.computed(() => {
|
|
@@ -48,11 +48,13 @@ var useTags = () => {
|
|
|
48
48
|
const preloadMeta = Vue.computed(() => {
|
|
49
49
|
const preloadMeta = [];
|
|
50
50
|
matches.value.map((match) => router.looseRoutesById[match.routeId]).forEach((route) => router.ssr?.manifest?.routes[route.id]?.preloads?.filter(Boolean).forEach((preload) => {
|
|
51
|
+
const preloadLink = resolveManifestAssetLink(preload);
|
|
51
52
|
preloadMeta.push({
|
|
52
53
|
tag: "link",
|
|
53
54
|
attrs: {
|
|
54
55
|
rel: "modulepreload",
|
|
55
|
-
href:
|
|
56
|
+
href: preloadLink.href,
|
|
57
|
+
crossOrigin: getAssetCrossOrigin(assetCrossOrigin, "modulepreload") ?? preloadLink.crossOrigin
|
|
56
58
|
}
|
|
57
59
|
});
|
|
58
60
|
}));
|
|
@@ -67,7 +69,10 @@ var useTags = () => {
|
|
|
67
69
|
const manifest = router.ssr?.manifest;
|
|
68
70
|
return matches.value.map((match) => manifest?.routes[match.routeId]?.assets ?? []).filter(Boolean).flat(1).filter((asset) => asset.tag === "link").map((asset) => ({
|
|
69
71
|
tag: "link",
|
|
70
|
-
attrs: {
|
|
72
|
+
attrs: {
|
|
73
|
+
...asset.attrs,
|
|
74
|
+
crossOrigin: getAssetCrossOrigin(assetCrossOrigin, "stylesheet") ?? asset.attrs?.crossOrigin
|
|
75
|
+
}
|
|
71
76
|
}));
|
|
72
77
|
});
|
|
73
78
|
return () => uniqBy([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headContentUtils.js","names":["Vue","escapeHtml","useStore","useRouter","useTags","router","matches","stores","activeMatchesSnapshot","value","meta","computed","resultMeta","metaByAttribute","title","map","match","filter","Boolean","reverse","forEach","metas","m","tag","children","json","JSON","stringify","push","attrs","type","attribute","name","property","links","flat","link","preloadMeta","looseRoutesById","routeId","route","ssr","manifest","routes","id","preloads","preload","rel","href","headScripts","script","manifestAssets","assets","asset","uniqBy","d","arr","fn","seen","Set","item","key","has","add"],"sources":["../../src/headContentUtils.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport {
|
|
1
|
+
{"version":3,"file":"headContentUtils.js","names":["Vue","escapeHtml","getAssetCrossOrigin","resolveManifestAssetLink","useStore","useRouter","useTags","assetCrossOrigin","router","matches","stores","activeMatchesSnapshot","value","meta","computed","resultMeta","metaByAttribute","title","map","match","filter","Boolean","reverse","forEach","metas","m","tag","children","json","JSON","stringify","push","attrs","type","attribute","name","property","links","flat","link","preloadMeta","looseRoutesById","routeId","route","ssr","manifest","routes","id","preloads","preload","preloadLink","rel","href","crossOrigin","headScripts","script","manifestAssets","assets","asset","uniqBy","d","arr","fn","seen","Set","item","key","has","add"],"sources":["../../src/headContentUtils.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport {\n escapeHtml,\n getAssetCrossOrigin,\n resolveManifestAssetLink,\n} from '@tanstack/router-core'\nimport { useStore } from '@tanstack/vue-store'\nimport { useRouter } from './useRouter'\nimport type {\n AssetCrossOriginConfig,\n RouterManagedTag,\n} from '@tanstack/router-core'\n\nexport const useTags = (assetCrossOrigin?: AssetCrossOriginConfig) => {\n const router = useRouter()\n const matches = useStore(\n router.stores.activeMatchesSnapshot,\n (value) => value,\n )\n\n const meta = Vue.computed<Array<RouterManagedTag>>(() => {\n const resultMeta: Array<RouterManagedTag> = []\n const metaByAttribute: Record<string, true> = {}\n let title: RouterManagedTag | undefined\n ;[...matches.value.map((match) => match.meta!).filter(Boolean)]\n .reverse()\n .forEach((metas) => {\n ;[...metas].reverse().forEach((m) => {\n if (!m) return\n\n if (m.title) {\n if (!title) {\n title = {\n tag: 'title',\n children: m.title,\n }\n }\n } else if ('script:ld+json' in m) {\n // Handle JSON-LD structured data\n // Content is HTML-escaped to prevent XSS when injected via innerHTML\n try {\n const json = JSON.stringify(m['script:ld+json'])\n resultMeta.push({\n tag: 'script',\n attrs: {\n type: 'application/ld+json',\n },\n children: escapeHtml(json),\n })\n } catch {\n // Skip invalid JSON-LD objects\n }\n } else {\n const attribute = m.name ?? m.property\n if (attribute) {\n if (metaByAttribute[attribute]) {\n return\n } else {\n metaByAttribute[attribute] = true\n }\n }\n\n resultMeta.push({\n tag: 'meta',\n attrs: {\n ...m,\n },\n })\n }\n })\n })\n\n if (title) {\n resultMeta.push(title)\n }\n\n resultMeta.reverse()\n\n return resultMeta\n })\n\n const links = Vue.computed<Array<RouterManagedTag>>(\n () =>\n matches.value\n .map((match) => match.links!)\n .filter(Boolean)\n .flat(1)\n .map((link) => ({\n tag: 'link',\n attrs: {\n ...link,\n },\n })) as Array<RouterManagedTag>,\n )\n\n const preloadMeta = Vue.computed<Array<RouterManagedTag>>(() => {\n const preloadMeta: Array<RouterManagedTag> = []\n\n matches.value\n .map((match) => router.looseRoutesById[match.routeId]!)\n .forEach((route) =>\n router.ssr?.manifest?.routes[route.id]?.preloads\n ?.filter(Boolean)\n .forEach((preload) => {\n const preloadLink = resolveManifestAssetLink(preload)\n preloadMeta.push({\n tag: 'link',\n attrs: {\n rel: 'modulepreload',\n href: preloadLink.href,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'modulepreload') ??\n preloadLink.crossOrigin,\n },\n })\n }),\n )\n\n return preloadMeta\n })\n\n const headScripts = Vue.computed<Array<RouterManagedTag>>(() =>\n (\n matches.value\n .map((match) => match.headScripts!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...script }) => ({\n tag: 'script',\n attrs: {\n ...script,\n },\n children,\n })),\n )\n\n const manifestAssets = Vue.computed<Array<RouterManagedTag>>(() => {\n const manifest = router.ssr?.manifest\n\n const assets = matches.value\n .map((match) => manifest?.routes[match.routeId]?.assets ?? [])\n .filter(Boolean)\n .flat(1)\n .filter((asset) => asset.tag === 'link')\n .map(\n (asset) =>\n ({\n tag: 'link',\n attrs: {\n ...asset.attrs,\n crossOrigin:\n getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??\n asset.attrs?.crossOrigin,\n },\n }) satisfies RouterManagedTag,\n )\n\n return assets\n })\n\n return () =>\n uniqBy(\n [\n ...manifestAssets.value,\n ...meta.value,\n ...preloadMeta.value,\n ...links.value,\n ...headScripts.value,\n ] as Array<RouterManagedTag>,\n (d) => {\n return JSON.stringify(d)\n },\n )\n}\n\nexport function uniqBy<T>(arr: Array<T>, fn: (item: T) => string) {\n const seen = new Set<string>()\n return arr.filter((item) => {\n const key = fn(item)\n if (seen.has(key)) {\n return false\n }\n seen.add(key)\n return true\n })\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { AnyRouter, RegisteredRouter, ResolveUseLoaderDeps, StrictOrFrom, UseLoaderDepsResult } from '@tanstack/router-core';
|
|
2
|
+
import type * as Vue from 'vue';
|
|
2
3
|
export interface UseLoaderDepsBaseOptions<TRouter extends AnyRouter, TFrom, TSelected> {
|
|
3
4
|
select?: (deps: ResolveUseLoaderDeps<TRouter, TFrom>) => TSelected;
|
|
4
5
|
}
|
|
5
6
|
export type UseLoaderDepsOptions<TRouter extends AnyRouter, TFrom extends string | undefined, TSelected> = StrictOrFrom<TRouter, TFrom> & UseLoaderDepsBaseOptions<TRouter, TFrom, TSelected>;
|
|
6
|
-
export type UseLoaderDepsRoute<out TId> = <TRouter extends AnyRouter = RegisteredRouter, TSelected = unknown>(opts?: UseLoaderDepsBaseOptions<TRouter, TId, TSelected>) => UseLoaderDepsResult<TRouter, TId, TSelected
|
|
7
|
-
export declare function useLoaderDeps<TRouter extends AnyRouter = RegisteredRouter, const TFrom extends string | undefined = undefined, TSelected = unknown>(opts: UseLoaderDepsOptions<TRouter, TFrom, TSelected>): UseLoaderDepsResult<TRouter, TFrom, TSelected
|
|
7
|
+
export type UseLoaderDepsRoute<out TId> = <TRouter extends AnyRouter = RegisteredRouter, TSelected = unknown>(opts?: UseLoaderDepsBaseOptions<TRouter, TId, TSelected>) => Vue.Ref<UseLoaderDepsResult<TRouter, TId, TSelected>>;
|
|
8
|
+
export declare function useLoaderDeps<TRouter extends AnyRouter = RegisteredRouter, const TFrom extends string | undefined = undefined, TSelected = unknown>(opts: UseLoaderDepsOptions<TRouter, TFrom, TSelected>): Vue.Ref<UseLoaderDepsResult<TRouter, TFrom, TSelected>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLoaderDeps.js","names":["useMatch","useLoaderDeps","opts","select","rest","s","loaderDeps"],"sources":["../../src/useLoaderDeps.tsx"],"sourcesContent":["import { useMatch } from './useMatch'\nimport type {\n AnyRouter,\n RegisteredRouter,\n ResolveUseLoaderDeps,\n StrictOrFrom,\n UseLoaderDepsResult,\n} from '@tanstack/router-core'\n\nexport interface UseLoaderDepsBaseOptions<\n TRouter extends AnyRouter,\n TFrom,\n TSelected,\n> {\n select?: (deps: ResolveUseLoaderDeps<TRouter, TFrom>) => TSelected\n}\n\nexport type UseLoaderDepsOptions<\n TRouter extends AnyRouter,\n TFrom extends string | undefined,\n TSelected,\n> = StrictOrFrom<TRouter, TFrom> &\n UseLoaderDepsBaseOptions<TRouter, TFrom, TSelected>\n\nexport type UseLoaderDepsRoute<out TId> = <\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseLoaderDepsBaseOptions<TRouter, TId, TSelected>,\n) => UseLoaderDepsResult<TRouter, TId, TSelected
|
|
1
|
+
{"version":3,"file":"useLoaderDeps.js","names":["useMatch","useLoaderDeps","opts","select","rest","s","loaderDeps"],"sources":["../../src/useLoaderDeps.tsx"],"sourcesContent":["import { useMatch } from './useMatch'\nimport type * as Vue from 'vue'\nimport type {\n AnyRouter,\n RegisteredRouter,\n ResolveUseLoaderDeps,\n StrictOrFrom,\n UseLoaderDepsResult,\n} from '@tanstack/router-core'\n\nexport interface UseLoaderDepsBaseOptions<\n TRouter extends AnyRouter,\n TFrom,\n TSelected,\n> {\n select?: (deps: ResolveUseLoaderDeps<TRouter, TFrom>) => TSelected\n}\n\nexport type UseLoaderDepsOptions<\n TRouter extends AnyRouter,\n TFrom extends string | undefined,\n TSelected,\n> = StrictOrFrom<TRouter, TFrom> &\n UseLoaderDepsBaseOptions<TRouter, TFrom, TSelected>\n\nexport type UseLoaderDepsRoute<out TId> = <\n TRouter extends AnyRouter = RegisteredRouter,\n TSelected = unknown,\n>(\n opts?: UseLoaderDepsBaseOptions<TRouter, TId, TSelected>,\n) => Vue.Ref<UseLoaderDepsResult<TRouter, TId, TSelected>>\n\nexport function useLoaderDeps<\n TRouter extends AnyRouter = RegisteredRouter,\n const TFrom extends string | undefined = undefined,\n TSelected = unknown,\n>(\n opts: UseLoaderDepsOptions<TRouter, TFrom, TSelected>,\n): Vue.Ref<UseLoaderDepsResult<TRouter, TFrom, TSelected>> {\n const { select, ...rest } = opts\n return useMatch({\n ...rest,\n select: (s) => {\n return select ? select(s.loaderDeps) : s.loaderDeps\n },\n }) as Vue.Ref<UseLoaderDepsResult<TRouter, TFrom, TSelected>>\n}\n"],"mappings":";;AAgCA,SAAgBC,cAKdC,MACyD;CACzD,MAAM,EAAEC,QAAQ,GAAGC,SAASF;AAC5B,QAAOF,SAAS;EACd,GAAGI;EACHD,SAASE,MAAM;AACb,UAAOF,SAASA,OAAOE,EAAEC,WAAW,GAAGD,EAAEC;;EAE5C,CAAC"}
|
|
@@ -1,8 +1,24 @@
|
|
|
1
1
|
import * as Vue from 'vue';
|
|
2
|
+
import type { AssetCrossOriginConfig } from '@tanstack/router-core';
|
|
3
|
+
export interface HeadContentProps {
|
|
4
|
+
assetCrossOrigin?: AssetCrossOriginConfig;
|
|
5
|
+
}
|
|
2
6
|
/**
|
|
3
7
|
* @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.
|
|
4
8
|
* It should be rendered in the `<head>` of your document.
|
|
5
9
|
*/
|
|
6
|
-
export declare const HeadContent: Vue.DefineComponent<
|
|
10
|
+
export declare const HeadContent: Vue.DefineComponent<Vue.ExtractPropTypes<{
|
|
11
|
+
assetCrossOrigin: {
|
|
12
|
+
type: Vue.PropType<AssetCrossOriginConfig>;
|
|
13
|
+
default: undefined;
|
|
14
|
+
};
|
|
15
|
+
}>, () => Vue.VNode<Vue.RendererNode, Vue.RendererElement, {
|
|
7
16
|
[key: string]: any;
|
|
8
|
-
}>[], {}, {}, {}, Vue.ComponentOptionsMixin, Vue.ComponentOptionsMixin, {}, string, Vue.PublicProps, Readonly<
|
|
17
|
+
}>[], {}, {}, {}, Vue.ComponentOptionsMixin, Vue.ComponentOptionsMixin, {}, string, Vue.PublicProps, Readonly<Vue.ExtractPropTypes<{
|
|
18
|
+
assetCrossOrigin: {
|
|
19
|
+
type: Vue.PropType<AssetCrossOriginConfig>;
|
|
20
|
+
default: undefined;
|
|
21
|
+
};
|
|
22
|
+
}>> & Readonly<{}>, {
|
|
23
|
+
assetCrossOrigin: AssetCrossOriginConfig;
|
|
24
|
+
}, {}, {}, {}, string, Vue.ComponentProvideOptions, true, {}, any>;
|
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
import * as Vue from 'vue';
|
|
2
|
+
import type { AssetCrossOriginConfig } from '@tanstack/router-core';
|
|
2
3
|
/**
|
|
3
4
|
* @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.
|
|
4
5
|
* It should be rendered in the `<head>` of your document.
|
|
5
6
|
*
|
|
6
7
|
* This is the development version that filters out dev styles after hydration.
|
|
7
8
|
*/
|
|
8
|
-
export declare const HeadContent: Vue.DefineComponent<
|
|
9
|
+
export declare const HeadContent: Vue.DefineComponent<Vue.ExtractPropTypes<{
|
|
10
|
+
assetCrossOrigin: {
|
|
11
|
+
type: Vue.PropType<AssetCrossOriginConfig>;
|
|
12
|
+
default: undefined;
|
|
13
|
+
};
|
|
14
|
+
}>, () => Vue.VNode<Vue.RendererNode, Vue.RendererElement, {
|
|
9
15
|
[key: string]: any;
|
|
10
|
-
}>[], {}, {}, {}, Vue.ComponentOptionsMixin, Vue.ComponentOptionsMixin, {}, string, Vue.PublicProps, Readonly<
|
|
16
|
+
}>[], {}, {}, {}, Vue.ComponentOptionsMixin, Vue.ComponentOptionsMixin, {}, string, Vue.PublicProps, Readonly<Vue.ExtractPropTypes<{
|
|
17
|
+
assetCrossOrigin: {
|
|
18
|
+
type: Vue.PropType<AssetCrossOriginConfig>;
|
|
19
|
+
default: undefined;
|
|
20
|
+
};
|
|
21
|
+
}>> & Readonly<{}>, {
|
|
22
|
+
assetCrossOrigin: AssetCrossOriginConfig;
|
|
23
|
+
}, {}, {}, {}, string, Vue.ComponentProvideOptions, true, {}, any>;
|
|
@@ -11,8 +11,14 @@ const DEV_STYLES_ATTR = 'data-tanstack-router-dev-styles';
|
|
|
11
11
|
*/
|
|
12
12
|
export const HeadContent = Vue.defineComponent({
|
|
13
13
|
name: 'HeadContent',
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
props: {
|
|
15
|
+
assetCrossOrigin: {
|
|
16
|
+
type: [String, Object],
|
|
17
|
+
default: undefined,
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
setup(props) {
|
|
21
|
+
const tags = useTags(props.assetCrossOrigin);
|
|
16
22
|
const hydrated = useHydrated();
|
|
17
23
|
// Fallback cleanup for hydration mismatch cases
|
|
18
24
|
Vue.onMounted(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadContent.dev.jsx","sourceRoot":"","sources":["../../src/HeadContent.dev.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAA;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"HeadContent.dev.jsx","sourceRoot":"","sources":["../../src/HeadContent.dev.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAA;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAG5C,MAAM,eAAe,GAAG,iCAAiC,CAAA;AAEzD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC,eAAe,CAAC;IAC7C,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE;QACL,gBAAgB,EAAE;YAChB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAyC;YAC9D,OAAO,EAAE,SAAS;SACnB;KACF;IACD,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;QAC5C,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;QAE9B,gDAAgD;QAChD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACjB,QAAQ;iBACL,gBAAgB,CAAC,QAAQ,eAAe,GAAG,CAAC;iBAC5C,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE;YACV,wCAAwC;YACxC,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK;gBACjC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,CAAC;gBACvD,CAAC,CAAC,IAAI,EAAE,CAAA;YAEV,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC9B,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;gBACX,GAAG,GAAG;gBACN,GAAG,EAAE,YAAY,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;aACvC,CAAC,CACH,CAAA;QACH,CAAC,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -7,8 +7,14 @@ import { useTags } from './headContentUtils';
|
|
|
7
7
|
*/
|
|
8
8
|
export const HeadContent = Vue.defineComponent({
|
|
9
9
|
name: 'HeadContent',
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
props: {
|
|
11
|
+
assetCrossOrigin: {
|
|
12
|
+
type: [String, Object],
|
|
13
|
+
default: undefined,
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
setup(props) {
|
|
17
|
+
const tags = useTags(props.assetCrossOrigin);
|
|
12
18
|
return () => {
|
|
13
19
|
return tags().map((tag) => Vue.h(Asset, {
|
|
14
20
|
...tag,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadContent.jsx","sourceRoot":"","sources":["../../src/HeadContent.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAA;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"HeadContent.jsx","sourceRoot":"","sources":["../../src/HeadContent.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAA;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAO5C;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC,eAAe,CAAC;IAC7C,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE;QACL,gBAAgB,EAAE;YAChB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAyC;YAC9D,OAAO,EAAE,SAAS;SACnB;KACF;IACD,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;QAE5C,OAAO,GAAG,EAAE;YACV,OAAO,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACxB,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;gBACX,GAAG,GAAG;gBACN,GAAG,EAAE,YAAY,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;aACvC,CAAC,CACH,CAAA;QACH,CAAC,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { RouterManagedTag } from '@tanstack/router-core';
|
|
2
|
-
export declare const useTags: () => () => RouterManagedTag[];
|
|
1
|
+
import type { AssetCrossOriginConfig, RouterManagedTag } from '@tanstack/router-core';
|
|
2
|
+
export declare const useTags: (assetCrossOrigin?: AssetCrossOriginConfig) => () => RouterManagedTag[];
|
|
3
3
|
export declare function uniqBy<T>(arr: Array<T>, fn: (item: T) => string): T[];
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as Vue from 'vue';
|
|
2
|
-
import { escapeHtml } from '@tanstack/router-core';
|
|
2
|
+
import { escapeHtml, getAssetCrossOrigin, resolveManifestAssetLink, } from '@tanstack/router-core';
|
|
3
3
|
import { useStore } from '@tanstack/vue-store';
|
|
4
4
|
import { useRouter } from './useRouter';
|
|
5
|
-
export const useTags = () => {
|
|
5
|
+
export const useTags = (assetCrossOrigin) => {
|
|
6
6
|
const router = useRouter();
|
|
7
7
|
const matches = useStore(router.stores.activeMatchesSnapshot, (value) => value);
|
|
8
8
|
const meta = Vue.computed(() => {
|
|
@@ -83,11 +83,14 @@ export const useTags = () => {
|
|
|
83
83
|
.forEach((route) => router.ssr?.manifest?.routes[route.id]?.preloads
|
|
84
84
|
?.filter(Boolean)
|
|
85
85
|
.forEach((preload) => {
|
|
86
|
+
const preloadLink = resolveManifestAssetLink(preload);
|
|
86
87
|
preloadMeta.push({
|
|
87
88
|
tag: 'link',
|
|
88
89
|
attrs: {
|
|
89
90
|
rel: 'modulepreload',
|
|
90
|
-
href:
|
|
91
|
+
href: preloadLink.href,
|
|
92
|
+
crossOrigin: getAssetCrossOrigin(assetCrossOrigin, 'modulepreload') ??
|
|
93
|
+
preloadLink.crossOrigin,
|
|
91
94
|
},
|
|
92
95
|
});
|
|
93
96
|
}));
|
|
@@ -112,7 +115,11 @@ export const useTags = () => {
|
|
|
112
115
|
.filter((asset) => asset.tag === 'link')
|
|
113
116
|
.map((asset) => ({
|
|
114
117
|
tag: 'link',
|
|
115
|
-
attrs: {
|
|
118
|
+
attrs: {
|
|
119
|
+
...asset.attrs,
|
|
120
|
+
crossOrigin: getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??
|
|
121
|
+
asset.attrs?.crossOrigin,
|
|
122
|
+
},
|
|
116
123
|
}));
|
|
117
124
|
return assets;
|
|
118
125
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headContentUtils.jsx","sourceRoot":"","sources":["../../src/headContentUtils.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAA;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"headContentUtils.jsx","sourceRoot":"","sources":["../../src/headContentUtils.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import type * as Vue from 'vue';
|
|
1
2
|
import type { AnyRouter, RegisteredRouter, ResolveUseLoaderDeps, StrictOrFrom, UseLoaderDepsResult } from '@tanstack/router-core';
|
|
2
3
|
export interface UseLoaderDepsBaseOptions<TRouter extends AnyRouter, TFrom, TSelected> {
|
|
3
4
|
select?: (deps: ResolveUseLoaderDeps<TRouter, TFrom>) => TSelected;
|
|
4
5
|
}
|
|
5
6
|
export type UseLoaderDepsOptions<TRouter extends AnyRouter, TFrom extends string | undefined, TSelected> = StrictOrFrom<TRouter, TFrom> & UseLoaderDepsBaseOptions<TRouter, TFrom, TSelected>;
|
|
6
|
-
export type UseLoaderDepsRoute<out TId> = <TRouter extends AnyRouter = RegisteredRouter, TSelected = unknown>(opts?: UseLoaderDepsBaseOptions<TRouter, TId, TSelected>) => UseLoaderDepsResult<TRouter, TId, TSelected
|
|
7
|
-
export declare function useLoaderDeps<TRouter extends AnyRouter = RegisteredRouter, const TFrom extends string | undefined = undefined, TSelected = unknown>(opts: UseLoaderDepsOptions<TRouter, TFrom, TSelected>): UseLoaderDepsResult<TRouter, TFrom, TSelected
|
|
7
|
+
export type UseLoaderDepsRoute<out TId> = <TRouter extends AnyRouter = RegisteredRouter, TSelected = unknown>(opts?: UseLoaderDepsBaseOptions<TRouter, TId, TSelected>) => Vue.Ref<UseLoaderDepsResult<TRouter, TId, TSelected>>;
|
|
8
|
+
export declare function useLoaderDeps<TRouter extends AnyRouter = RegisteredRouter, const TFrom extends string | undefined = undefined, TSelected = unknown>(opts: UseLoaderDepsOptions<TRouter, TFrom, TSelected>): Vue.Ref<UseLoaderDepsResult<TRouter, TFrom, TSelected>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLoaderDeps.jsx","sourceRoot":"","sources":["../../src/useLoaderDeps.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"useLoaderDeps.jsx","sourceRoot":"","sources":["../../src/useLoaderDeps.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAgCrC,MAAM,UAAU,aAAa,CAK3B,IAAqD;IAErD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAA;IAChC,OAAO,QAAQ,CAAC;QACd,GAAG,IAAI;QACP,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;YACZ,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;QACrD,CAAC;KACF,CAA4D,CAAA;AAC/D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/vue-router",
|
|
3
|
-
"version": "1.168.
|
|
3
|
+
"version": "1.168.4",
|
|
4
4
|
"description": "Modern and scalable routing for Vue applications",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -60,12 +60,12 @@
|
|
|
60
60
|
"node": ">=20.19"
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|
|
63
|
-
"@tanstack/vue-store": "^0.9.
|
|
63
|
+
"@tanstack/vue-store": "^0.9.3",
|
|
64
64
|
"@vue/runtime-dom": "^3.5.25",
|
|
65
65
|
"isbot": "^5.1.22",
|
|
66
66
|
"jsesc": "^3.0.2",
|
|
67
67
|
"@tanstack/history": "1.161.6",
|
|
68
|
-
"@tanstack/router-core": "1.168.
|
|
68
|
+
"@tanstack/router-core": "1.168.4"
|
|
69
69
|
},
|
|
70
70
|
"devDependencies": {
|
|
71
71
|
"@tanstack/intent": "^0.0.14",
|
|
@@ -77,7 +77,8 @@
|
|
|
77
77
|
"combinate": "^1.1.11",
|
|
78
78
|
"vite": "*",
|
|
79
79
|
"vue": "^3.5.25",
|
|
80
|
-
"zod": "^3.23.8"
|
|
80
|
+
"zod": "^3.23.8",
|
|
81
|
+
"@types/node": ">=20"
|
|
81
82
|
},
|
|
82
83
|
"peerDependencies": {
|
|
83
84
|
"vue": "^3.3.0"
|
package/src/HeadContent.dev.tsx
CHANGED
|
@@ -3,6 +3,7 @@ import * as Vue from 'vue'
|
|
|
3
3
|
import { Asset } from './Asset'
|
|
4
4
|
import { useHydrated } from './ClientOnly'
|
|
5
5
|
import { useTags } from './headContentUtils'
|
|
6
|
+
import type { AssetCrossOriginConfig } from '@tanstack/router-core'
|
|
6
7
|
|
|
7
8
|
const DEV_STYLES_ATTR = 'data-tanstack-router-dev-styles'
|
|
8
9
|
|
|
@@ -14,8 +15,14 @@ const DEV_STYLES_ATTR = 'data-tanstack-router-dev-styles'
|
|
|
14
15
|
*/
|
|
15
16
|
export const HeadContent = Vue.defineComponent({
|
|
16
17
|
name: 'HeadContent',
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
props: {
|
|
19
|
+
assetCrossOrigin: {
|
|
20
|
+
type: [String, Object] as Vue.PropType<AssetCrossOriginConfig>,
|
|
21
|
+
default: undefined,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
setup(props) {
|
|
25
|
+
const tags = useTags(props.assetCrossOrigin)
|
|
19
26
|
const hydrated = useHydrated()
|
|
20
27
|
|
|
21
28
|
// Fallback cleanup for hydration mismatch cases
|
package/src/HeadContent.tsx
CHANGED
|
@@ -2,6 +2,11 @@ import * as Vue from 'vue'
|
|
|
2
2
|
|
|
3
3
|
import { Asset } from './Asset'
|
|
4
4
|
import { useTags } from './headContentUtils'
|
|
5
|
+
import type { AssetCrossOriginConfig } from '@tanstack/router-core'
|
|
6
|
+
|
|
7
|
+
export interface HeadContentProps {
|
|
8
|
+
assetCrossOrigin?: AssetCrossOriginConfig
|
|
9
|
+
}
|
|
5
10
|
|
|
6
11
|
/**
|
|
7
12
|
* @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.
|
|
@@ -9,8 +14,14 @@ import { useTags } from './headContentUtils'
|
|
|
9
14
|
*/
|
|
10
15
|
export const HeadContent = Vue.defineComponent({
|
|
11
16
|
name: 'HeadContent',
|
|
12
|
-
|
|
13
|
-
|
|
17
|
+
props: {
|
|
18
|
+
assetCrossOrigin: {
|
|
19
|
+
type: [String, Object] as Vue.PropType<AssetCrossOriginConfig>,
|
|
20
|
+
default: undefined,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
setup(props) {
|
|
24
|
+
const tags = useTags(props.assetCrossOrigin)
|
|
14
25
|
|
|
15
26
|
return () => {
|
|
16
27
|
return tags().map((tag) =>
|
package/src/headContentUtils.tsx
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import * as Vue from 'vue'
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
escapeHtml,
|
|
4
|
+
getAssetCrossOrigin,
|
|
5
|
+
resolveManifestAssetLink,
|
|
6
|
+
} from '@tanstack/router-core'
|
|
3
7
|
import { useStore } from '@tanstack/vue-store'
|
|
4
8
|
import { useRouter } from './useRouter'
|
|
5
|
-
import type {
|
|
9
|
+
import type {
|
|
10
|
+
AssetCrossOriginConfig,
|
|
11
|
+
RouterManagedTag,
|
|
12
|
+
} from '@tanstack/router-core'
|
|
6
13
|
|
|
7
|
-
export const useTags = () => {
|
|
14
|
+
export const useTags = (assetCrossOrigin?: AssetCrossOriginConfig) => {
|
|
8
15
|
const router = useRouter()
|
|
9
16
|
const matches = useStore(
|
|
10
17
|
router.stores.activeMatchesSnapshot,
|
|
@@ -95,11 +102,15 @@ export const useTags = () => {
|
|
|
95
102
|
router.ssr?.manifest?.routes[route.id]?.preloads
|
|
96
103
|
?.filter(Boolean)
|
|
97
104
|
.forEach((preload) => {
|
|
105
|
+
const preloadLink = resolveManifestAssetLink(preload)
|
|
98
106
|
preloadMeta.push({
|
|
99
107
|
tag: 'link',
|
|
100
108
|
attrs: {
|
|
101
109
|
rel: 'modulepreload',
|
|
102
|
-
href:
|
|
110
|
+
href: preloadLink.href,
|
|
111
|
+
crossOrigin:
|
|
112
|
+
getAssetCrossOrigin(assetCrossOrigin, 'modulepreload') ??
|
|
113
|
+
preloadLink.crossOrigin,
|
|
103
114
|
},
|
|
104
115
|
})
|
|
105
116
|
}),
|
|
@@ -135,7 +146,12 @@ export const useTags = () => {
|
|
|
135
146
|
(asset) =>
|
|
136
147
|
({
|
|
137
148
|
tag: 'link',
|
|
138
|
-
attrs: {
|
|
149
|
+
attrs: {
|
|
150
|
+
...asset.attrs,
|
|
151
|
+
crossOrigin:
|
|
152
|
+
getAssetCrossOrigin(assetCrossOrigin, 'stylesheet') ??
|
|
153
|
+
asset.attrs?.crossOrigin,
|
|
154
|
+
},
|
|
139
155
|
}) satisfies RouterManagedTag,
|
|
140
156
|
)
|
|
141
157
|
|
package/src/useLoaderDeps.tsx
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useMatch } from './useMatch'
|
|
2
|
+
import type * as Vue from 'vue'
|
|
2
3
|
import type {
|
|
3
4
|
AnyRouter,
|
|
4
5
|
RegisteredRouter,
|
|
@@ -27,7 +28,7 @@ export type UseLoaderDepsRoute<out TId> = <
|
|
|
27
28
|
TSelected = unknown,
|
|
28
29
|
>(
|
|
29
30
|
opts?: UseLoaderDepsBaseOptions<TRouter, TId, TSelected>,
|
|
30
|
-
) => UseLoaderDepsResult<TRouter, TId, TSelected
|
|
31
|
+
) => Vue.Ref<UseLoaderDepsResult<TRouter, TId, TSelected>>
|
|
31
32
|
|
|
32
33
|
export function useLoaderDeps<
|
|
33
34
|
TRouter extends AnyRouter = RegisteredRouter,
|
|
@@ -35,12 +36,12 @@ export function useLoaderDeps<
|
|
|
35
36
|
TSelected = unknown,
|
|
36
37
|
>(
|
|
37
38
|
opts: UseLoaderDepsOptions<TRouter, TFrom, TSelected>,
|
|
38
|
-
): UseLoaderDepsResult<TRouter, TFrom, TSelected
|
|
39
|
+
): Vue.Ref<UseLoaderDepsResult<TRouter, TFrom, TSelected>> {
|
|
39
40
|
const { select, ...rest } = opts
|
|
40
41
|
return useMatch({
|
|
41
42
|
...rest,
|
|
42
43
|
select: (s) => {
|
|
43
44
|
return select ? select(s.loaderDeps) : s.loaderDeps
|
|
44
45
|
},
|
|
45
|
-
}) as UseLoaderDepsResult<TRouter, TFrom, TSelected
|
|
46
|
+
}) as Vue.Ref<UseLoaderDepsResult<TRouter, TFrom, TSelected>>
|
|
46
47
|
}
|