@tanstack/solid-router 1.133.10 → 1.133.13
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/cjs/HeadContent.cjs +24 -6
- package/dist/cjs/HeadContent.cjs.map +1 -1
- package/dist/cjs/Scripts.cjs +7 -2
- package/dist/cjs/Scripts.cjs.map +1 -1
- package/dist/esm/HeadContent.js +24 -6
- package/dist/esm/HeadContent.js.map +1 -1
- package/dist/esm/Scripts.js +7 -2
- package/dist/esm/Scripts.js.map +1 -1
- package/dist/source/HeadContent.jsx +16 -1
- package/dist/source/HeadContent.jsx.map +1 -1
- package/dist/source/Scripts.jsx +3 -1
- package/dist/source/Scripts.jsx.map +1 -1
- package/package.json +2 -2
- package/src/HeadContent.tsx +17 -2
- package/src/Scripts.tsx +3 -2
package/dist/cjs/HeadContent.cjs
CHANGED
|
@@ -25,6 +25,7 @@ function _interopNamespaceDefault(e) {
|
|
|
25
25
|
const Solid__namespace = /* @__PURE__ */ _interopNamespaceDefault(Solid$1);
|
|
26
26
|
const useTags = () => {
|
|
27
27
|
const router = useRouter.useRouter();
|
|
28
|
+
const nonce = router.options.ssr?.nonce;
|
|
28
29
|
const routeMeta = useRouterState.useRouterState({
|
|
29
30
|
select: (state) => {
|
|
30
31
|
return state.matches.map((match) => match.meta).filter(Boolean);
|
|
@@ -59,7 +60,8 @@ const useTags = () => {
|
|
|
59
60
|
resultMeta.push({
|
|
60
61
|
tag: "meta",
|
|
61
62
|
attrs: {
|
|
62
|
-
...m
|
|
63
|
+
...m,
|
|
64
|
+
nonce
|
|
63
65
|
}
|
|
64
66
|
});
|
|
65
67
|
}
|
|
@@ -68,6 +70,15 @@ const useTags = () => {
|
|
|
68
70
|
if (title) {
|
|
69
71
|
resultMeta.push(title);
|
|
70
72
|
}
|
|
73
|
+
if (router.options.ssr?.nonce) {
|
|
74
|
+
resultMeta.push({
|
|
75
|
+
tag: "meta",
|
|
76
|
+
attrs: {
|
|
77
|
+
property: "csp-nonce",
|
|
78
|
+
content: router.options.ssr.nonce
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
71
82
|
resultMeta.reverse();
|
|
72
83
|
return resultMeta;
|
|
73
84
|
});
|
|
@@ -76,13 +87,17 @@ const useTags = () => {
|
|
|
76
87
|
const constructed = state.matches.map((match) => match.links).filter(Boolean).flat(1).map((link) => ({
|
|
77
88
|
tag: "link",
|
|
78
89
|
attrs: {
|
|
79
|
-
...link
|
|
90
|
+
...link,
|
|
91
|
+
nonce
|
|
80
92
|
}
|
|
81
93
|
}));
|
|
82
94
|
const manifest = router.ssr?.manifest;
|
|
83
95
|
const assets = state.matches.map((match) => manifest?.routes[match.routeId]?.assets ?? []).filter(Boolean).flat(1).filter((asset) => asset.tag === "link").map((asset) => ({
|
|
84
96
|
tag: "link",
|
|
85
|
-
attrs:
|
|
97
|
+
attrs: {
|
|
98
|
+
...asset.attrs,
|
|
99
|
+
nonce
|
|
100
|
+
}
|
|
86
101
|
}));
|
|
87
102
|
return [...constructed, ...assets];
|
|
88
103
|
}
|
|
@@ -95,7 +110,8 @@ const useTags = () => {
|
|
|
95
110
|
tag: "link",
|
|
96
111
|
attrs: {
|
|
97
112
|
rel: "modulepreload",
|
|
98
|
-
href: preload
|
|
113
|
+
href: preload,
|
|
114
|
+
nonce
|
|
99
115
|
}
|
|
100
116
|
});
|
|
101
117
|
}));
|
|
@@ -109,7 +125,8 @@ const useTags = () => {
|
|
|
109
125
|
}) => ({
|
|
110
126
|
tag: "style",
|
|
111
127
|
attrs: {
|
|
112
|
-
...style
|
|
128
|
+
...style,
|
|
129
|
+
nonce
|
|
113
130
|
},
|
|
114
131
|
children
|
|
115
132
|
}))
|
|
@@ -121,7 +138,8 @@ const useTags = () => {
|
|
|
121
138
|
}) => ({
|
|
122
139
|
tag: "script",
|
|
123
140
|
attrs: {
|
|
124
|
-
...script
|
|
141
|
+
...script,
|
|
142
|
+
nonce
|
|
125
143
|
},
|
|
126
144
|
children
|
|
127
145
|
}))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadContent.cjs","sources":["../../src/HeadContent.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { MetaProvider } from '@solidjs/meta'\nimport { Asset } from './Asset'\nimport { useRouter } from './useRouter'\nimport { useRouterState } from './useRouterState'\nimport type { RouterManagedTag } from '@tanstack/router-core'\n\nexport const useTags = () => {\n const router = useRouter()\n\n const routeMeta = useRouterState({\n select: (state) => {\n return state.matches.map((match) => match.meta!).filter(Boolean)\n },\n })\n\n const meta: Solid.Accessor<Array<RouterManagedTag>> = Solid.createMemo(() => {\n const resultMeta: Array<RouterManagedTag> = []\n const metaByAttribute: Record<string, true> = {}\n let title: RouterManagedTag | undefined\n const routeMetasArray = routeMeta()\n for (let i = routeMetasArray.length - 1; i >= 0; i--) {\n const metas = routeMetasArray[i]!\n for (let j = metas.length - 1; j >= 0; j--) {\n const m = metas[j]\n if (!m) continue\n\n if (m.title) {\n if (!title) {\n title = {\n tag: 'title',\n children: m.title,\n }\n }\n } else {\n const attribute = m.name ?? m.property\n if (attribute) {\n if (metaByAttribute[attribute]) {\n continue\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 = useRouterState({\n select: (state) => {\n const constructed = state.matches\n .map((match) => match.links!)\n .filter(Boolean)\n .flat(1)\n .map((link) => ({\n tag: 'link',\n attrs: {\n ...link,\n },\n })) satisfies Array<RouterManagedTag>\n\n const manifest = router.ssr?.manifest\n\n // These are the assets extracted from the ViteManifest\n // using the `startManifestPlugin`\n const assets = state.matches\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: asset.attrs,\n }) satisfies RouterManagedTag,\n )\n\n return [...constructed, ...assets]\n },\n })\n\n const preloadMeta = useRouterState({\n select: (state) => {\n const preloadMeta: Array<RouterManagedTag> = []\n\n state.matches\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 preloadMeta.push({\n tag: 'link',\n attrs: {\n rel: 'modulepreload',\n href: preload,\n },\n })\n }),\n )\n\n return preloadMeta\n },\n })\n\n const styles = useRouterState({\n select: (state) =>\n (\n state.matches\n .map((match) => match.styles!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...style }) => ({\n tag: 'style',\n attrs: {\n ...style,\n },\n children,\n })),\n })\n\n const headScripts = useRouterState({\n select: (state) =>\n (\n state.matches\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 return () =>\n uniqBy(\n [\n ...meta(),\n ...preloadMeta(),\n ...links(),\n ...styles(),\n ...headScripts(),\n ] as Array<RouterManagedTag>,\n (d) => {\n return JSON.stringify(d)\n },\n )\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 function HeadContent() {\n const tags = useTags()\n return (\n <MetaProvider>\n {tags().map((tag) => (\n <Asset {...tag} />\n ))}\n </MetaProvider>\n )\n}\n\nfunction 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"],"names":["useTags","router","useRouter","routeMeta","useRouterState","select","state","matches","map","match","meta","filter","Boolean","Solid","createMemo","resultMeta","metaByAttribute","title","routeMetasArray","i","length","metas","j","m","tag","children","attribute","name","property","push","attrs","reverse","links","constructed","flat","link","manifest","
|
|
1
|
+
{"version":3,"file":"HeadContent.cjs","sources":["../../src/HeadContent.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { MetaProvider } from '@solidjs/meta'\nimport { Asset } from './Asset'\nimport { useRouter } from './useRouter'\nimport { useRouterState } from './useRouterState'\nimport type { RouterManagedTag } from '@tanstack/router-core'\n\nexport const useTags = () => {\n const router = useRouter()\n const nonce = router.options.ssr?.nonce\n const routeMeta = useRouterState({\n select: (state) => {\n return state.matches.map((match) => match.meta!).filter(Boolean)\n },\n })\n\n const meta: Solid.Accessor<Array<RouterManagedTag>> = Solid.createMemo(() => {\n const resultMeta: Array<RouterManagedTag> = []\n const metaByAttribute: Record<string, true> = {}\n let title: RouterManagedTag | undefined\n const routeMetasArray = routeMeta()\n for (let i = routeMetasArray.length - 1; i >= 0; i--) {\n const metas = routeMetasArray[i]!\n for (let j = metas.length - 1; j >= 0; j--) {\n const m = metas[j]\n if (!m) continue\n\n if (m.title) {\n if (!title) {\n title = {\n tag: 'title',\n children: m.title,\n }\n }\n } else {\n const attribute = m.name ?? m.property\n if (attribute) {\n if (metaByAttribute[attribute]) {\n continue\n } else {\n metaByAttribute[attribute] = true\n }\n }\n\n resultMeta.push({\n tag: 'meta',\n attrs: {\n ...m,\n nonce,\n },\n })\n }\n }\n }\n\n if (title) {\n resultMeta.push(title)\n }\n\n if (router.options.ssr?.nonce) {\n resultMeta.push({\n tag: 'meta',\n attrs: {\n property: 'csp-nonce',\n content: router.options.ssr.nonce,\n },\n })\n }\n resultMeta.reverse()\n\n return resultMeta\n })\n\n const links = useRouterState({\n select: (state) => {\n const constructed = state.matches\n .map((match) => match.links!)\n .filter(Boolean)\n .flat(1)\n .map((link) => ({\n tag: 'link',\n attrs: {\n ...link,\n nonce,\n },\n })) satisfies Array<RouterManagedTag>\n\n const manifest = router.ssr?.manifest\n\n // These are the assets extracted from the ViteManifest\n // using the `startManifestPlugin`\n const assets = state.matches\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: { ...asset.attrs, nonce },\n }) satisfies RouterManagedTag,\n )\n\n return [...constructed, ...assets]\n },\n })\n\n const preloadMeta = useRouterState({\n select: (state) => {\n const preloadMeta: Array<RouterManagedTag> = []\n\n state.matches\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 preloadMeta.push({\n tag: 'link',\n attrs: {\n rel: 'modulepreload',\n href: preload,\n nonce,\n },\n })\n }),\n )\n\n return preloadMeta\n },\n })\n\n const styles = useRouterState({\n select: (state) =>\n (\n state.matches\n .map((match) => match.styles!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...style }) => ({\n tag: 'style',\n attrs: {\n ...style,\n nonce,\n },\n children,\n })),\n })\n\n const headScripts = useRouterState({\n select: (state) =>\n (\n state.matches\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 nonce,\n },\n children,\n })),\n })\n\n return () =>\n uniqBy(\n [\n ...meta(),\n ...preloadMeta(),\n ...links(),\n ...styles(),\n ...headScripts(),\n ] as Array<RouterManagedTag>,\n (d) => {\n return JSON.stringify(d)\n },\n )\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 function HeadContent() {\n const tags = useTags()\n\n return (\n <MetaProvider>\n {tags().map((tag) => (\n <Asset {...tag} />\n ))}\n </MetaProvider>\n )\n}\n\nfunction 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"],"names":["useTags","router","useRouter","nonce","options","ssr","routeMeta","useRouterState","select","state","matches","map","match","meta","filter","Boolean","Solid","createMemo","resultMeta","metaByAttribute","title","routeMetasArray","i","length","metas","j","m","tag","children","attribute","name","property","push","attrs","content","reverse","links","constructed","flat","link","manifest","assets","routes","routeId","asset","preloadMeta","looseRoutesById","forEach","route","id","preloads","preload","rel","href","styles","style","headScripts","script","uniqBy","d","JSON","stringify","HeadContent","tags","_$createComponent","MetaProvider","Asset","arr","fn","seen","Set","item","key","has","add"],"mappings":"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"}
|
package/dist/cjs/Scripts.cjs
CHANGED
|
@@ -6,6 +6,7 @@ const useRouterState = require("./useRouterState.cjs");
|
|
|
6
6
|
const useRouter = require("./useRouter.cjs");
|
|
7
7
|
const Scripts = () => {
|
|
8
8
|
const router = useRouter.useRouter();
|
|
9
|
+
const nonce = router.options.ssr?.nonce;
|
|
9
10
|
const assetScripts = useRouterState.useRouterState({
|
|
10
11
|
select: (state) => {
|
|
11
12
|
const assetScripts2 = [];
|
|
@@ -16,7 +17,10 @@ const Scripts = () => {
|
|
|
16
17
|
state.matches.map((match) => router.looseRoutesById[match.routeId]).forEach((route) => manifest.routes[route.id]?.assets?.filter((d) => d.tag === "script").forEach((asset) => {
|
|
17
18
|
assetScripts2.push({
|
|
18
19
|
tag: "script",
|
|
19
|
-
attrs:
|
|
20
|
+
attrs: {
|
|
21
|
+
...asset.attrs,
|
|
22
|
+
nonce
|
|
23
|
+
},
|
|
20
24
|
children: asset.children
|
|
21
25
|
});
|
|
22
26
|
}));
|
|
@@ -31,7 +35,8 @@ const Scripts = () => {
|
|
|
31
35
|
}) => ({
|
|
32
36
|
tag: "script",
|
|
33
37
|
attrs: {
|
|
34
|
-
...script
|
|
38
|
+
...script,
|
|
39
|
+
nonce
|
|
35
40
|
},
|
|
36
41
|
children
|
|
37
42
|
}))
|
package/dist/cjs/Scripts.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Scripts.cjs","sources":["../../src/Scripts.tsx"],"sourcesContent":["import { Asset } from './Asset'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport type { RouterManagedTag } from '@tanstack/router-core'\n\nexport const Scripts = () => {\n const router = useRouter()\n\n const assetScripts = useRouterState({\n select: (state) => {\n const assetScripts: Array<RouterManagedTag> = []\n const manifest = router.ssr?.manifest\n\n if (!manifest) {\n return []\n }\n\n state.matches\n .map((match) => router.looseRoutesById[match.routeId]!)\n .forEach((route) =>\n manifest.routes[route.id]?.assets\n ?.filter((d) => d.tag === 'script')\n .forEach((asset) => {\n assetScripts.push({\n tag: 'script',\n attrs: asset.attrs,\n children: asset.children,\n } as any)\n }),\n )\n\n return assetScripts\n },\n })\n\n const scripts = useRouterState({\n select: (state) => ({\n scripts: (\n state.matches\n .map((match) => match.scripts!)\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\n const allScripts = [\n ...scripts().scripts,\n ...assetScripts(),\n ] as Array<RouterManagedTag>\n\n return (\n <>\n {allScripts.map((asset, i) => (\n <Asset {...asset} />\n ))}\n </>\n )\n}\n"],"names":["Scripts","router","useRouter","assetScripts","useRouterState","select","state","manifest","
|
|
1
|
+
{"version":3,"file":"Scripts.cjs","sources":["../../src/Scripts.tsx"],"sourcesContent":["import { Asset } from './Asset'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport type { RouterManagedTag } from '@tanstack/router-core'\n\nexport const Scripts = () => {\n const router = useRouter()\n const nonce = router.options.ssr?.nonce\n const assetScripts = useRouterState({\n select: (state) => {\n const assetScripts: Array<RouterManagedTag> = []\n const manifest = router.ssr?.manifest\n\n if (!manifest) {\n return []\n }\n\n state.matches\n .map((match) => router.looseRoutesById[match.routeId]!)\n .forEach((route) =>\n manifest.routes[route.id]?.assets\n ?.filter((d) => d.tag === 'script')\n .forEach((asset) => {\n assetScripts.push({\n tag: 'script',\n attrs: { ...asset.attrs, nonce },\n children: asset.children,\n } as any)\n }),\n )\n\n return assetScripts\n },\n })\n\n const scripts = useRouterState({\n select: (state) => ({\n scripts: (\n state.matches\n .map((match) => match.scripts!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...script }) => ({\n tag: 'script',\n attrs: {\n ...script,\n nonce,\n },\n children,\n })),\n }),\n })\n\n const allScripts = [\n ...scripts().scripts,\n ...assetScripts(),\n ] as Array<RouterManagedTag>\n\n return (\n <>\n {allScripts.map((asset, i) => (\n <Asset {...asset} />\n ))}\n </>\n )\n}\n"],"names":["Scripts","router","useRouter","nonce","options","ssr","assetScripts","useRouterState","select","state","manifest","matches","map","match","looseRoutesById","routeId","forEach","route","routes","id","assets","filter","d","tag","asset","push","attrs","children","scripts","flat","Boolean","script","allScripts","_$memo","i","_$createComponent","Asset"],"mappings":";;;;;;AAKO,MAAMA,UAAUA,MAAM;AAC3B,QAAMC,SAASC,UAAAA,UAAAA;AACf,QAAMC,QAAQF,OAAOG,QAAQC,KAAKF;AAClC,QAAMG,eAAeC,eAAAA,eAAe;AAAA,IAClCC,QAASC,CAAAA,UAAU;AACjB,YAAMH,gBAAwC,CAAA;AAC9C,YAAMI,WAAWT,OAAOI,KAAKK;AAE7B,UAAI,CAACA,UAAU;AACb,eAAO,CAAA;AAAA,MACT;AAEAD,YAAME,QACHC,IAAKC,CAAAA,UAAUZ,OAAOa,gBAAgBD,MAAME,OAAO,CAAE,EACrDC,QAASC,CAAAA,UACRP,SAASQ,OAAOD,MAAME,EAAE,GAAGC,QACvBC,OAAQC,CAAAA,MAAMA,EAAEC,QAAQ,QAAQ,EACjCP,QAASQ,CAAAA,UAAU;AAClBlB,sBAAamB,KAAK;AAAA,UAChBF,KAAK;AAAA,UACLG,OAAO;AAAA,YAAE,GAAGF,MAAME;AAAAA,YAAOvB;AAAAA,UAAAA;AAAAA,UACzBwB,UAAUH,MAAMG;AAAAA,QAAAA,CACV;AAAA,MACV,CAAC,CACL;AAEF,aAAOrB;AAAAA,IACT;AAAA,EAAA,CACD;AAED,QAAMsB,UAAUrB,eAAAA,eAAe;AAAA,IAC7BC,QAASC,CAAAA,WAAW;AAAA,MAClBmB,SACEnB,MAAME,QACHC,IAAKC,WAAUA,MAAMe,OAAQ,EAC7BC,KAAK,CAAC,EACNR,OAAOS,OAAO,EACjBlB,IAAI,CAAC;AAAA,QAAEe;AAAAA,QAAU,GAAGI;AAAAA,MAAAA,OAAc;AAAA,QAClCR,KAAK;AAAA,QACLG,OAAO;AAAA,UACL,GAAGK;AAAAA,UACH5B;AAAAA,QAAAA;AAAAA,QAEFwB;AAAAA,MAAAA,EACA;AAAA,IAAA;AAAA,EACJ,CACD;AAED,QAAMK,aAAa,CACjB,GAAGJ,QAAAA,EAAUA,SACb,GAAGtB,cAAc;AAGnB,SAAA2B,WAAA,MAEKD,WAAWpB,IAAI,CAACY,OAAOU,MAACC,sBACtBC,MAAAA,OAAUZ,KAAK,CACjB,CAAC;AAGR;;"}
|
package/dist/esm/HeadContent.js
CHANGED
|
@@ -6,6 +6,7 @@ import { useRouter } from "./useRouter.js";
|
|
|
6
6
|
import { useRouterState } from "./useRouterState.js";
|
|
7
7
|
const useTags = () => {
|
|
8
8
|
const router = useRouter();
|
|
9
|
+
const nonce = router.options.ssr?.nonce;
|
|
9
10
|
const routeMeta = useRouterState({
|
|
10
11
|
select: (state) => {
|
|
11
12
|
return state.matches.map((match) => match.meta).filter(Boolean);
|
|
@@ -40,7 +41,8 @@ const useTags = () => {
|
|
|
40
41
|
resultMeta.push({
|
|
41
42
|
tag: "meta",
|
|
42
43
|
attrs: {
|
|
43
|
-
...m
|
|
44
|
+
...m,
|
|
45
|
+
nonce
|
|
44
46
|
}
|
|
45
47
|
});
|
|
46
48
|
}
|
|
@@ -49,6 +51,15 @@ const useTags = () => {
|
|
|
49
51
|
if (title) {
|
|
50
52
|
resultMeta.push(title);
|
|
51
53
|
}
|
|
54
|
+
if (router.options.ssr?.nonce) {
|
|
55
|
+
resultMeta.push({
|
|
56
|
+
tag: "meta",
|
|
57
|
+
attrs: {
|
|
58
|
+
property: "csp-nonce",
|
|
59
|
+
content: router.options.ssr.nonce
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
52
63
|
resultMeta.reverse();
|
|
53
64
|
return resultMeta;
|
|
54
65
|
});
|
|
@@ -57,13 +68,17 @@ const useTags = () => {
|
|
|
57
68
|
const constructed = state.matches.map((match) => match.links).filter(Boolean).flat(1).map((link) => ({
|
|
58
69
|
tag: "link",
|
|
59
70
|
attrs: {
|
|
60
|
-
...link
|
|
71
|
+
...link,
|
|
72
|
+
nonce
|
|
61
73
|
}
|
|
62
74
|
}));
|
|
63
75
|
const manifest = router.ssr?.manifest;
|
|
64
76
|
const assets = state.matches.map((match) => manifest?.routes[match.routeId]?.assets ?? []).filter(Boolean).flat(1).filter((asset) => asset.tag === "link").map((asset) => ({
|
|
65
77
|
tag: "link",
|
|
66
|
-
attrs:
|
|
78
|
+
attrs: {
|
|
79
|
+
...asset.attrs,
|
|
80
|
+
nonce
|
|
81
|
+
}
|
|
67
82
|
}));
|
|
68
83
|
return [...constructed, ...assets];
|
|
69
84
|
}
|
|
@@ -76,7 +91,8 @@ const useTags = () => {
|
|
|
76
91
|
tag: "link",
|
|
77
92
|
attrs: {
|
|
78
93
|
rel: "modulepreload",
|
|
79
|
-
href: preload
|
|
94
|
+
href: preload,
|
|
95
|
+
nonce
|
|
80
96
|
}
|
|
81
97
|
});
|
|
82
98
|
}));
|
|
@@ -90,7 +106,8 @@ const useTags = () => {
|
|
|
90
106
|
}) => ({
|
|
91
107
|
tag: "style",
|
|
92
108
|
attrs: {
|
|
93
|
-
...style
|
|
109
|
+
...style,
|
|
110
|
+
nonce
|
|
94
111
|
},
|
|
95
112
|
children
|
|
96
113
|
}))
|
|
@@ -102,7 +119,8 @@ const useTags = () => {
|
|
|
102
119
|
}) => ({
|
|
103
120
|
tag: "script",
|
|
104
121
|
attrs: {
|
|
105
|
-
...script
|
|
122
|
+
...script,
|
|
123
|
+
nonce
|
|
106
124
|
},
|
|
107
125
|
children
|
|
108
126
|
}))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadContent.js","sources":["../../src/HeadContent.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { MetaProvider } from '@solidjs/meta'\nimport { Asset } from './Asset'\nimport { useRouter } from './useRouter'\nimport { useRouterState } from './useRouterState'\nimport type { RouterManagedTag } from '@tanstack/router-core'\n\nexport const useTags = () => {\n const router = useRouter()\n\n const routeMeta = useRouterState({\n select: (state) => {\n return state.matches.map((match) => match.meta!).filter(Boolean)\n },\n })\n\n const meta: Solid.Accessor<Array<RouterManagedTag>> = Solid.createMemo(() => {\n const resultMeta: Array<RouterManagedTag> = []\n const metaByAttribute: Record<string, true> = {}\n let title: RouterManagedTag | undefined\n const routeMetasArray = routeMeta()\n for (let i = routeMetasArray.length - 1; i >= 0; i--) {\n const metas = routeMetasArray[i]!\n for (let j = metas.length - 1; j >= 0; j--) {\n const m = metas[j]\n if (!m) continue\n\n if (m.title) {\n if (!title) {\n title = {\n tag: 'title',\n children: m.title,\n }\n }\n } else {\n const attribute = m.name ?? m.property\n if (attribute) {\n if (metaByAttribute[attribute]) {\n continue\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 = useRouterState({\n select: (state) => {\n const constructed = state.matches\n .map((match) => match.links!)\n .filter(Boolean)\n .flat(1)\n .map((link) => ({\n tag: 'link',\n attrs: {\n ...link,\n },\n })) satisfies Array<RouterManagedTag>\n\n const manifest = router.ssr?.manifest\n\n // These are the assets extracted from the ViteManifest\n // using the `startManifestPlugin`\n const assets = state.matches\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: asset.attrs,\n }) satisfies RouterManagedTag,\n )\n\n return [...constructed, ...assets]\n },\n })\n\n const preloadMeta = useRouterState({\n select: (state) => {\n const preloadMeta: Array<RouterManagedTag> = []\n\n state.matches\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 preloadMeta.push({\n tag: 'link',\n attrs: {\n rel: 'modulepreload',\n href: preload,\n },\n })\n }),\n )\n\n return preloadMeta\n },\n })\n\n const styles = useRouterState({\n select: (state) =>\n (\n state.matches\n .map((match) => match.styles!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...style }) => ({\n tag: 'style',\n attrs: {\n ...style,\n },\n children,\n })),\n })\n\n const headScripts = useRouterState({\n select: (state) =>\n (\n state.matches\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 return () =>\n uniqBy(\n [\n ...meta(),\n ...preloadMeta(),\n ...links(),\n ...styles(),\n ...headScripts(),\n ] as Array<RouterManagedTag>,\n (d) => {\n return JSON.stringify(d)\n },\n )\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 function HeadContent() {\n const tags = useTags()\n return (\n <MetaProvider>\n {tags().map((tag) => (\n <Asset {...tag} />\n ))}\n </MetaProvider>\n )\n}\n\nfunction 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"],"names":["useTags","router","useRouter","routeMeta","useRouterState","select","state","matches","map","match","meta","filter","Boolean","Solid","createMemo","resultMeta","metaByAttribute","title","routeMetasArray","i","length","metas","j","m","tag","children","attribute","name","property","push","attrs","reverse","links","constructed","flat","link","manifest","
|
|
1
|
+
{"version":3,"file":"HeadContent.js","sources":["../../src/HeadContent.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\nimport { MetaProvider } from '@solidjs/meta'\nimport { Asset } from './Asset'\nimport { useRouter } from './useRouter'\nimport { useRouterState } from './useRouterState'\nimport type { RouterManagedTag } from '@tanstack/router-core'\n\nexport const useTags = () => {\n const router = useRouter()\n const nonce = router.options.ssr?.nonce\n const routeMeta = useRouterState({\n select: (state) => {\n return state.matches.map((match) => match.meta!).filter(Boolean)\n },\n })\n\n const meta: Solid.Accessor<Array<RouterManagedTag>> = Solid.createMemo(() => {\n const resultMeta: Array<RouterManagedTag> = []\n const metaByAttribute: Record<string, true> = {}\n let title: RouterManagedTag | undefined\n const routeMetasArray = routeMeta()\n for (let i = routeMetasArray.length - 1; i >= 0; i--) {\n const metas = routeMetasArray[i]!\n for (let j = metas.length - 1; j >= 0; j--) {\n const m = metas[j]\n if (!m) continue\n\n if (m.title) {\n if (!title) {\n title = {\n tag: 'title',\n children: m.title,\n }\n }\n } else {\n const attribute = m.name ?? m.property\n if (attribute) {\n if (metaByAttribute[attribute]) {\n continue\n } else {\n metaByAttribute[attribute] = true\n }\n }\n\n resultMeta.push({\n tag: 'meta',\n attrs: {\n ...m,\n nonce,\n },\n })\n }\n }\n }\n\n if (title) {\n resultMeta.push(title)\n }\n\n if (router.options.ssr?.nonce) {\n resultMeta.push({\n tag: 'meta',\n attrs: {\n property: 'csp-nonce',\n content: router.options.ssr.nonce,\n },\n })\n }\n resultMeta.reverse()\n\n return resultMeta\n })\n\n const links = useRouterState({\n select: (state) => {\n const constructed = state.matches\n .map((match) => match.links!)\n .filter(Boolean)\n .flat(1)\n .map((link) => ({\n tag: 'link',\n attrs: {\n ...link,\n nonce,\n },\n })) satisfies Array<RouterManagedTag>\n\n const manifest = router.ssr?.manifest\n\n // These are the assets extracted from the ViteManifest\n // using the `startManifestPlugin`\n const assets = state.matches\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: { ...asset.attrs, nonce },\n }) satisfies RouterManagedTag,\n )\n\n return [...constructed, ...assets]\n },\n })\n\n const preloadMeta = useRouterState({\n select: (state) => {\n const preloadMeta: Array<RouterManagedTag> = []\n\n state.matches\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 preloadMeta.push({\n tag: 'link',\n attrs: {\n rel: 'modulepreload',\n href: preload,\n nonce,\n },\n })\n }),\n )\n\n return preloadMeta\n },\n })\n\n const styles = useRouterState({\n select: (state) =>\n (\n state.matches\n .map((match) => match.styles!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...style }) => ({\n tag: 'style',\n attrs: {\n ...style,\n nonce,\n },\n children,\n })),\n })\n\n const headScripts = useRouterState({\n select: (state) =>\n (\n state.matches\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 nonce,\n },\n children,\n })),\n })\n\n return () =>\n uniqBy(\n [\n ...meta(),\n ...preloadMeta(),\n ...links(),\n ...styles(),\n ...headScripts(),\n ] as Array<RouterManagedTag>,\n (d) => {\n return JSON.stringify(d)\n },\n )\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 function HeadContent() {\n const tags = useTags()\n\n return (\n <MetaProvider>\n {tags().map((tag) => (\n <Asset {...tag} />\n ))}\n </MetaProvider>\n )\n}\n\nfunction 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"],"names":["useTags","router","useRouter","nonce","options","ssr","routeMeta","useRouterState","select","state","matches","map","match","meta","filter","Boolean","Solid","createMemo","resultMeta","metaByAttribute","title","routeMetasArray","i","length","metas","j","m","tag","children","attribute","name","property","push","attrs","content","reverse","links","constructed","flat","link","manifest","assets","routes","routeId","asset","preloadMeta","looseRoutesById","forEach","route","id","preloads","preload","rel","href","styles","style","headScripts","script","uniqBy","d","JSON","stringify","HeadContent","tags","_$createComponent","MetaProvider","Asset","arr","fn","seen","Set","item","key","has","add"],"mappings":"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"}
|
package/dist/esm/Scripts.js
CHANGED
|
@@ -4,6 +4,7 @@ import { useRouterState } from "./useRouterState.js";
|
|
|
4
4
|
import { useRouter } from "./useRouter.js";
|
|
5
5
|
const Scripts = () => {
|
|
6
6
|
const router = useRouter();
|
|
7
|
+
const nonce = router.options.ssr?.nonce;
|
|
7
8
|
const assetScripts = useRouterState({
|
|
8
9
|
select: (state) => {
|
|
9
10
|
const assetScripts2 = [];
|
|
@@ -14,7 +15,10 @@ const Scripts = () => {
|
|
|
14
15
|
state.matches.map((match) => router.looseRoutesById[match.routeId]).forEach((route) => manifest.routes[route.id]?.assets?.filter((d) => d.tag === "script").forEach((asset) => {
|
|
15
16
|
assetScripts2.push({
|
|
16
17
|
tag: "script",
|
|
17
|
-
attrs:
|
|
18
|
+
attrs: {
|
|
19
|
+
...asset.attrs,
|
|
20
|
+
nonce
|
|
21
|
+
},
|
|
18
22
|
children: asset.children
|
|
19
23
|
});
|
|
20
24
|
}));
|
|
@@ -29,7 +33,8 @@ const Scripts = () => {
|
|
|
29
33
|
}) => ({
|
|
30
34
|
tag: "script",
|
|
31
35
|
attrs: {
|
|
32
|
-
...script
|
|
36
|
+
...script,
|
|
37
|
+
nonce
|
|
33
38
|
},
|
|
34
39
|
children
|
|
35
40
|
}))
|
package/dist/esm/Scripts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Scripts.js","sources":["../../src/Scripts.tsx"],"sourcesContent":["import { Asset } from './Asset'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport type { RouterManagedTag } from '@tanstack/router-core'\n\nexport const Scripts = () => {\n const router = useRouter()\n\n const assetScripts = useRouterState({\n select: (state) => {\n const assetScripts: Array<RouterManagedTag> = []\n const manifest = router.ssr?.manifest\n\n if (!manifest) {\n return []\n }\n\n state.matches\n .map((match) => router.looseRoutesById[match.routeId]!)\n .forEach((route) =>\n manifest.routes[route.id]?.assets\n ?.filter((d) => d.tag === 'script')\n .forEach((asset) => {\n assetScripts.push({\n tag: 'script',\n attrs: asset.attrs,\n children: asset.children,\n } as any)\n }),\n )\n\n return assetScripts\n },\n })\n\n const scripts = useRouterState({\n select: (state) => ({\n scripts: (\n state.matches\n .map((match) => match.scripts!)\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\n const allScripts = [\n ...scripts().scripts,\n ...assetScripts(),\n ] as Array<RouterManagedTag>\n\n return (\n <>\n {allScripts.map((asset, i) => (\n <Asset {...asset} />\n ))}\n </>\n )\n}\n"],"names":["Scripts","router","useRouter","assetScripts","useRouterState","select","state","manifest","
|
|
1
|
+
{"version":3,"file":"Scripts.js","sources":["../../src/Scripts.tsx"],"sourcesContent":["import { Asset } from './Asset'\nimport { useRouterState } from './useRouterState'\nimport { useRouter } from './useRouter'\nimport type { RouterManagedTag } from '@tanstack/router-core'\n\nexport const Scripts = () => {\n const router = useRouter()\n const nonce = router.options.ssr?.nonce\n const assetScripts = useRouterState({\n select: (state) => {\n const assetScripts: Array<RouterManagedTag> = []\n const manifest = router.ssr?.manifest\n\n if (!manifest) {\n return []\n }\n\n state.matches\n .map((match) => router.looseRoutesById[match.routeId]!)\n .forEach((route) =>\n manifest.routes[route.id]?.assets\n ?.filter((d) => d.tag === 'script')\n .forEach((asset) => {\n assetScripts.push({\n tag: 'script',\n attrs: { ...asset.attrs, nonce },\n children: asset.children,\n } as any)\n }),\n )\n\n return assetScripts\n },\n })\n\n const scripts = useRouterState({\n select: (state) => ({\n scripts: (\n state.matches\n .map((match) => match.scripts!)\n .flat(1)\n .filter(Boolean) as Array<RouterManagedTag>\n ).map(({ children, ...script }) => ({\n tag: 'script',\n attrs: {\n ...script,\n nonce,\n },\n children,\n })),\n }),\n })\n\n const allScripts = [\n ...scripts().scripts,\n ...assetScripts(),\n ] as Array<RouterManagedTag>\n\n return (\n <>\n {allScripts.map((asset, i) => (\n <Asset {...asset} />\n ))}\n </>\n )\n}\n"],"names":["Scripts","router","useRouter","nonce","options","ssr","assetScripts","useRouterState","select","state","manifest","matches","map","match","looseRoutesById","routeId","forEach","route","routes","id","assets","filter","d","tag","asset","push","attrs","children","scripts","flat","Boolean","script","allScripts","_$memo","i","_$createComponent","Asset"],"mappings":";;;;AAKO,MAAMA,UAAUA,MAAM;AAC3B,QAAMC,SAASC,UAAAA;AACf,QAAMC,QAAQF,OAAOG,QAAQC,KAAKF;AAClC,QAAMG,eAAeC,eAAe;AAAA,IAClCC,QAASC,CAAAA,UAAU;AACjB,YAAMH,gBAAwC,CAAA;AAC9C,YAAMI,WAAWT,OAAOI,KAAKK;AAE7B,UAAI,CAACA,UAAU;AACb,eAAO,CAAA;AAAA,MACT;AAEAD,YAAME,QACHC,IAAKC,CAAAA,UAAUZ,OAAOa,gBAAgBD,MAAME,OAAO,CAAE,EACrDC,QAASC,CAAAA,UACRP,SAASQ,OAAOD,MAAME,EAAE,GAAGC,QACvBC,OAAQC,CAAAA,MAAMA,EAAEC,QAAQ,QAAQ,EACjCP,QAASQ,CAAAA,UAAU;AAClBlB,sBAAamB,KAAK;AAAA,UAChBF,KAAK;AAAA,UACLG,OAAO;AAAA,YAAE,GAAGF,MAAME;AAAAA,YAAOvB;AAAAA,UAAAA;AAAAA,UACzBwB,UAAUH,MAAMG;AAAAA,QAAAA,CACV;AAAA,MACV,CAAC,CACL;AAEF,aAAOrB;AAAAA,IACT;AAAA,EAAA,CACD;AAED,QAAMsB,UAAUrB,eAAe;AAAA,IAC7BC,QAASC,CAAAA,WAAW;AAAA,MAClBmB,SACEnB,MAAME,QACHC,IAAKC,WAAUA,MAAMe,OAAQ,EAC7BC,KAAK,CAAC,EACNR,OAAOS,OAAO,EACjBlB,IAAI,CAAC;AAAA,QAAEe;AAAAA,QAAU,GAAGI;AAAAA,MAAAA,OAAc;AAAA,QAClCR,KAAK;AAAA,QACLG,OAAO;AAAA,UACL,GAAGK;AAAAA,UACH5B;AAAAA,QAAAA;AAAAA,QAEFwB;AAAAA,MAAAA,EACA;AAAA,IAAA;AAAA,EACJ,CACD;AAED,QAAMK,aAAa,CACjB,GAAGJ,QAAAA,EAAUA,SACb,GAAGtB,cAAc;AAGnB,SAAA2B,KAAA,MAEKD,WAAWpB,IAAI,CAACY,OAAOU,MAACC,gBACtBC,OAAUZ,KAAK,CACjB,CAAC;AAGR;"}
|
|
@@ -5,6 +5,7 @@ import { useRouter } from './useRouter';
|
|
|
5
5
|
import { useRouterState } from './useRouterState';
|
|
6
6
|
export const useTags = () => {
|
|
7
7
|
const router = useRouter();
|
|
8
|
+
const nonce = router.options.ssr?.nonce;
|
|
8
9
|
const routeMeta = useRouterState({
|
|
9
10
|
select: (state) => {
|
|
10
11
|
return state.matches.map((match) => match.meta).filter(Boolean);
|
|
@@ -43,6 +44,7 @@ export const useTags = () => {
|
|
|
43
44
|
tag: 'meta',
|
|
44
45
|
attrs: {
|
|
45
46
|
...m,
|
|
47
|
+
nonce,
|
|
46
48
|
},
|
|
47
49
|
});
|
|
48
50
|
}
|
|
@@ -51,6 +53,15 @@ export const useTags = () => {
|
|
|
51
53
|
if (title) {
|
|
52
54
|
resultMeta.push(title);
|
|
53
55
|
}
|
|
56
|
+
if (router.options.ssr?.nonce) {
|
|
57
|
+
resultMeta.push({
|
|
58
|
+
tag: 'meta',
|
|
59
|
+
attrs: {
|
|
60
|
+
property: 'csp-nonce',
|
|
61
|
+
content: router.options.ssr.nonce,
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
}
|
|
54
65
|
resultMeta.reverse();
|
|
55
66
|
return resultMeta;
|
|
56
67
|
});
|
|
@@ -64,6 +75,7 @@ export const useTags = () => {
|
|
|
64
75
|
tag: 'link',
|
|
65
76
|
attrs: {
|
|
66
77
|
...link,
|
|
78
|
+
nonce,
|
|
67
79
|
},
|
|
68
80
|
}));
|
|
69
81
|
const manifest = router.ssr?.manifest;
|
|
@@ -76,7 +88,7 @@ export const useTags = () => {
|
|
|
76
88
|
.filter((asset) => asset.tag === 'link')
|
|
77
89
|
.map((asset) => ({
|
|
78
90
|
tag: 'link',
|
|
79
|
-
attrs: asset.attrs,
|
|
91
|
+
attrs: { ...asset.attrs, nonce },
|
|
80
92
|
}));
|
|
81
93
|
return [...constructed, ...assets];
|
|
82
94
|
},
|
|
@@ -94,6 +106,7 @@ export const useTags = () => {
|
|
|
94
106
|
attrs: {
|
|
95
107
|
rel: 'modulepreload',
|
|
96
108
|
href: preload,
|
|
109
|
+
nonce,
|
|
97
110
|
},
|
|
98
111
|
});
|
|
99
112
|
}));
|
|
@@ -108,6 +121,7 @@ export const useTags = () => {
|
|
|
108
121
|
tag: 'style',
|
|
109
122
|
attrs: {
|
|
110
123
|
...style,
|
|
124
|
+
nonce,
|
|
111
125
|
},
|
|
112
126
|
children,
|
|
113
127
|
})),
|
|
@@ -120,6 +134,7 @@ export const useTags = () => {
|
|
|
120
134
|
tag: 'script',
|
|
121
135
|
attrs: {
|
|
122
136
|
...script,
|
|
137
|
+
nonce,
|
|
123
138
|
},
|
|
124
139
|
children,
|
|
125
140
|
})),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadContent.jsx","sourceRoot":"","sources":["../../src/HeadContent.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAGjD,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE;IAC1B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"HeadContent.jsx","sourceRoot":"","sources":["../../src/HeadContent.tsx"],"names":[],"mappings":"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"}
|
package/dist/source/Scripts.jsx
CHANGED
|
@@ -3,6 +3,7 @@ import { useRouterState } from './useRouterState';
|
|
|
3
3
|
import { useRouter } from './useRouter';
|
|
4
4
|
export const Scripts = () => {
|
|
5
5
|
const router = useRouter();
|
|
6
|
+
const nonce = router.options.ssr?.nonce;
|
|
6
7
|
const assetScripts = useRouterState({
|
|
7
8
|
select: (state) => {
|
|
8
9
|
const assetScripts = [];
|
|
@@ -17,7 +18,7 @@ export const Scripts = () => {
|
|
|
17
18
|
.forEach((asset) => {
|
|
18
19
|
assetScripts.push({
|
|
19
20
|
tag: 'script',
|
|
20
|
-
attrs: asset.attrs,
|
|
21
|
+
attrs: { ...asset.attrs, nonce },
|
|
21
22
|
children: asset.children,
|
|
22
23
|
});
|
|
23
24
|
}));
|
|
@@ -33,6 +34,7 @@ export const Scripts = () => {
|
|
|
33
34
|
tag: 'script',
|
|
34
35
|
attrs: {
|
|
35
36
|
...script,
|
|
37
|
+
nonce,
|
|
36
38
|
},
|
|
37
39
|
children,
|
|
38
40
|
})),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Scripts.jsx","sourceRoot":"","sources":["../../src/Scripts.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGvC,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE;IAC1B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"Scripts.jsx","sourceRoot":"","sources":["../../src/Scripts.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGvC,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE;IAC1B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAA;IACvC,MAAM,YAAY,GAAG,cAAc,CAAC;QAClC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAChB,MAAM,YAAY,GAA4B,EAAE,CAAA;YAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAA;YAErC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,EAAE,CAAA;YACX,CAAC;YAED,KAAK,CAAC,OAAO;iBACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC;iBACtD,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CACjB,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,MAAM;gBAC/B,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC;iBAClC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBACjB,YAAY,CAAC,IAAI,CAAC;oBAChB,GAAG,EAAE,QAAQ;oBACb,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE;oBAChC,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBAClB,CAAC,CAAA;YACX,CAAC,CAAC,CACL,CAAA;YAEH,OAAO,YAAY,CAAA;QACrB,CAAC;KACF,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,cAAc,CAAC;QAC7B,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAClB,OAAO,EACL,KAAK,CAAC,OAAO;iBACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAQ,CAAC;iBAC9B,IAAI,CAAC,CAAC,CAAC;iBACP,MAAM,CAAC,OAAO,CAClB,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;gBAClC,GAAG,EAAE,QAAQ;gBACb,KAAK,EAAE;oBACL,GAAG,MAAM;oBACT,KAAK;iBACN;gBACD,QAAQ;aACT,CAAC,CAAC;SACJ,CAAC;KACH,CAAC,CAAA;IAEF,MAAM,UAAU,GAAG;QACjB,GAAG,OAAO,EAAE,CAAC,OAAO;QACpB,GAAG,YAAY,EAAE;KACS,CAAA;IAE5B,OAAO,CACL,EACE;MAAA,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAC5B,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAG,CACrB,CAAC,CACJ;IAAA,GAAG,CACJ,CAAA;AACH,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/solid-router",
|
|
3
|
-
"version": "1.133.
|
|
3
|
+
"version": "1.133.13",
|
|
4
4
|
"description": "Modern and scalable routing for Solid applications",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"tiny-invariant": "^1.3.3",
|
|
90
90
|
"tiny-warning": "^1.0.3",
|
|
91
91
|
"@tanstack/history": "1.133.3",
|
|
92
|
-
"@tanstack/router-core": "1.133.
|
|
92
|
+
"@tanstack/router-core": "1.133.13"
|
|
93
93
|
},
|
|
94
94
|
"devDependencies": {
|
|
95
95
|
"@solidjs/testing-library": "^0.8.10",
|
package/src/HeadContent.tsx
CHANGED
|
@@ -7,7 +7,7 @@ import type { RouterManagedTag } from '@tanstack/router-core'
|
|
|
7
7
|
|
|
8
8
|
export const useTags = () => {
|
|
9
9
|
const router = useRouter()
|
|
10
|
-
|
|
10
|
+
const nonce = router.options.ssr?.nonce
|
|
11
11
|
const routeMeta = useRouterState({
|
|
12
12
|
select: (state) => {
|
|
13
13
|
return state.matches.map((match) => match.meta!).filter(Boolean)
|
|
@@ -46,6 +46,7 @@ export const useTags = () => {
|
|
|
46
46
|
tag: 'meta',
|
|
47
47
|
attrs: {
|
|
48
48
|
...m,
|
|
49
|
+
nonce,
|
|
49
50
|
},
|
|
50
51
|
})
|
|
51
52
|
}
|
|
@@ -56,6 +57,15 @@ export const useTags = () => {
|
|
|
56
57
|
resultMeta.push(title)
|
|
57
58
|
}
|
|
58
59
|
|
|
60
|
+
if (router.options.ssr?.nonce) {
|
|
61
|
+
resultMeta.push({
|
|
62
|
+
tag: 'meta',
|
|
63
|
+
attrs: {
|
|
64
|
+
property: 'csp-nonce',
|
|
65
|
+
content: router.options.ssr.nonce,
|
|
66
|
+
},
|
|
67
|
+
})
|
|
68
|
+
}
|
|
59
69
|
resultMeta.reverse()
|
|
60
70
|
|
|
61
71
|
return resultMeta
|
|
@@ -71,6 +81,7 @@ export const useTags = () => {
|
|
|
71
81
|
tag: 'link',
|
|
72
82
|
attrs: {
|
|
73
83
|
...link,
|
|
84
|
+
nonce,
|
|
74
85
|
},
|
|
75
86
|
})) satisfies Array<RouterManagedTag>
|
|
76
87
|
|
|
@@ -87,7 +98,7 @@ export const useTags = () => {
|
|
|
87
98
|
(asset) =>
|
|
88
99
|
({
|
|
89
100
|
tag: 'link',
|
|
90
|
-
attrs: asset.attrs,
|
|
101
|
+
attrs: { ...asset.attrs, nonce },
|
|
91
102
|
}) satisfies RouterManagedTag,
|
|
92
103
|
)
|
|
93
104
|
|
|
@@ -110,6 +121,7 @@ export const useTags = () => {
|
|
|
110
121
|
attrs: {
|
|
111
122
|
rel: 'modulepreload',
|
|
112
123
|
href: preload,
|
|
124
|
+
nonce,
|
|
113
125
|
},
|
|
114
126
|
})
|
|
115
127
|
}),
|
|
@@ -130,6 +142,7 @@ export const useTags = () => {
|
|
|
130
142
|
tag: 'style',
|
|
131
143
|
attrs: {
|
|
132
144
|
...style,
|
|
145
|
+
nonce,
|
|
133
146
|
},
|
|
134
147
|
children,
|
|
135
148
|
})),
|
|
@@ -146,6 +159,7 @@ export const useTags = () => {
|
|
|
146
159
|
tag: 'script',
|
|
147
160
|
attrs: {
|
|
148
161
|
...script,
|
|
162
|
+
nonce,
|
|
149
163
|
},
|
|
150
164
|
children,
|
|
151
165
|
})),
|
|
@@ -172,6 +186,7 @@ export const useTags = () => {
|
|
|
172
186
|
*/
|
|
173
187
|
export function HeadContent() {
|
|
174
188
|
const tags = useTags()
|
|
189
|
+
|
|
175
190
|
return (
|
|
176
191
|
<MetaProvider>
|
|
177
192
|
{tags().map((tag) => (
|
package/src/Scripts.tsx
CHANGED
|
@@ -5,7 +5,7 @@ import type { RouterManagedTag } from '@tanstack/router-core'
|
|
|
5
5
|
|
|
6
6
|
export const Scripts = () => {
|
|
7
7
|
const router = useRouter()
|
|
8
|
-
|
|
8
|
+
const nonce = router.options.ssr?.nonce
|
|
9
9
|
const assetScripts = useRouterState({
|
|
10
10
|
select: (state) => {
|
|
11
11
|
const assetScripts: Array<RouterManagedTag> = []
|
|
@@ -23,7 +23,7 @@ export const Scripts = () => {
|
|
|
23
23
|
.forEach((asset) => {
|
|
24
24
|
assetScripts.push({
|
|
25
25
|
tag: 'script',
|
|
26
|
-
attrs: asset.attrs,
|
|
26
|
+
attrs: { ...asset.attrs, nonce },
|
|
27
27
|
children: asset.children,
|
|
28
28
|
} as any)
|
|
29
29
|
}),
|
|
@@ -44,6 +44,7 @@ export const Scripts = () => {
|
|
|
44
44
|
tag: 'script',
|
|
45
45
|
attrs: {
|
|
46
46
|
...script,
|
|
47
|
+
nonce,
|
|
47
48
|
},
|
|
48
49
|
children,
|
|
49
50
|
})),
|