@tanstack/solid-router 1.112.0 → 1.112.7
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/Asset.cjs +18 -28
- package/dist/cjs/Asset.cjs.map +1 -1
- package/dist/cjs/HeadContent.cjs +9 -4
- package/dist/cjs/HeadContent.cjs.map +1 -1
- package/dist/cjs/HeadContent.d.cts +2 -2
- package/dist/cjs/index.cjs +1 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +1 -1
- package/dist/cjs/scroll-restoration.cjs +5 -1
- package/dist/cjs/scroll-restoration.cjs.map +1 -1
- package/dist/esm/Asset.js +19 -29
- package/dist/esm/Asset.js.map +1 -1
- package/dist/esm/HeadContent.d.ts +2 -2
- package/dist/esm/HeadContent.js +8 -3
- package/dist/esm/HeadContent.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/scroll-restoration.js +5 -1
- package/dist/esm/scroll-restoration.js.map +1 -1
- package/dist/source/Asset.jsx +4 -3
- package/dist/source/Asset.jsx.map +1 -1
- package/dist/source/HeadContent.d.ts +2 -2
- package/dist/source/HeadContent.jsx +6 -3
- package/dist/source/HeadContent.jsx.map +1 -1
- package/dist/source/index.d.ts +1 -1
- package/dist/source/index.jsx +1 -1
- package/dist/source/index.jsx.map +1 -1
- package/dist/source/scroll-restoration.jsx +6 -1
- package/dist/source/scroll-restoration.jsx.map +1 -1
- package/package.json +6 -5
- package/src/Asset.tsx +4 -3
- package/src/HeadContent.tsx +21 -13
- package/src/index.tsx +1 -1
- package/src/scroll-restoration.tsx +5 -1
package/dist/cjs/Asset.cjs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const web = require("solid-js/web");
|
|
4
|
-
|
|
4
|
+
const meta = require("@solidjs/meta");
|
|
5
|
+
var _tmpl$ = /* @__PURE__ */ web.template(`<link>`), _tmpl$2 = /* @__PURE__ */ web.template(`<script>`);
|
|
5
6
|
function Asset({
|
|
6
7
|
tag,
|
|
7
8
|
attrs,
|
|
@@ -9,46 +10,35 @@ function Asset({
|
|
|
9
10
|
}) {
|
|
10
11
|
switch (tag) {
|
|
11
12
|
case "title":
|
|
12
|
-
return ((
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
web.insert(_el$, children);
|
|
16
|
-
return _el$;
|
|
17
|
-
})();
|
|
13
|
+
return web.createComponent(meta.Title, web.mergeProps(attrs, {
|
|
14
|
+
children
|
|
15
|
+
}));
|
|
18
16
|
case "meta":
|
|
19
|
-
return (
|
|
20
|
-
var _el$2 = _tmpl$2();
|
|
21
|
-
web.spread(_el$2, attrs, false, false);
|
|
22
|
-
return _el$2;
|
|
23
|
-
})();
|
|
17
|
+
return web.createComponent(meta.Meta, attrs);
|
|
24
18
|
case "link":
|
|
25
19
|
return (() => {
|
|
26
|
-
var _el$
|
|
27
|
-
web.spread(_el
|
|
28
|
-
return _el
|
|
20
|
+
var _el$ = _tmpl$();
|
|
21
|
+
web.spread(_el$, attrs, false, false);
|
|
22
|
+
return _el$;
|
|
29
23
|
})();
|
|
30
24
|
case "style":
|
|
31
|
-
return ((
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
"innerHTML": children
|
|
35
|
-
}), false, false);
|
|
36
|
-
return _el$4;
|
|
37
|
-
})();
|
|
25
|
+
return web.createComponent(meta.Style, web.mergeProps(attrs, {
|
|
26
|
+
innerHTML: children
|
|
27
|
+
}));
|
|
38
28
|
case "script":
|
|
39
29
|
if (attrs && attrs.src) {
|
|
40
30
|
return (() => {
|
|
41
|
-
var _el$
|
|
42
|
-
web.spread(_el$
|
|
43
|
-
return _el$
|
|
31
|
+
var _el$2 = _tmpl$2();
|
|
32
|
+
web.spread(_el$2, attrs, false, false);
|
|
33
|
+
return _el$2;
|
|
44
34
|
})();
|
|
45
35
|
}
|
|
46
36
|
if (typeof children === "string") return (() => {
|
|
47
|
-
var _el$
|
|
48
|
-
web.spread(_el$
|
|
37
|
+
var _el$3 = _tmpl$2();
|
|
38
|
+
web.spread(_el$3, web.mergeProps(attrs, {
|
|
49
39
|
"innerHTML": children
|
|
50
40
|
}), false, false);
|
|
51
|
-
return _el$
|
|
41
|
+
return _el$3;
|
|
52
42
|
})();
|
|
53
43
|
return null;
|
|
54
44
|
default:
|
package/dist/cjs/Asset.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Asset.cjs","sources":["../../src/Asset.tsx"],"sourcesContent":["import type { RouterManagedTag } from '@tanstack/router-core'\n\nexport function Asset({ tag, attrs, children }: RouterManagedTag): any {\n switch (tag) {\n case 'title':\n return <
|
|
1
|
+
{"version":3,"file":"Asset.cjs","sources":["../../src/Asset.tsx"],"sourcesContent":["import { Meta, Style, Title } from '@solidjs/meta'\nimport type { RouterManagedTag } from '@tanstack/router-core'\n\nexport function Asset({ tag, attrs, children }: RouterManagedTag): any {\n switch (tag) {\n case 'title':\n return <Title {...attrs}>{children}</Title>\n case 'meta':\n return <Meta {...attrs} />\n case 'link':\n return <link {...attrs} />\n case 'style':\n return <Style {...attrs} innerHTML={children} />\n case 'script':\n if ((attrs as any) && (attrs as any).src) {\n return <script {...attrs} />\n }\n if (typeof children === 'string')\n return <script {...attrs} innerHTML={children} />\n return null\n default:\n return null\n }\n}\n"],"names":["Asset","tag","attrs","children","_$createComponent","Title","_$mergeProps","Meta","_el$","_tmpl$","Style","innerHTML","src","_el$2","_tmpl$2","_el$3"],"mappings":";;;;;AAGO,SAASA,MAAM;AAAA,EAAEC;AAAAA,EAAKC;AAAAA,EAAOC;AAA2B,GAAQ;AACrE,UAAQF,KAAG;AAAA,IACT,KAAK;AACHG,aAAAA,oBAAQC,KAAAA,OAAKC,IAAAA,WAAKJ,OAAK;AAAA,QAAAC;AAAAA,MAAAA,CAAW,CAAA;AAAA,IACpC,KAAK;AACHC,aAAAA,IAAAA,gBAAQG,WAASL,KAAK;AAAA,IACxB,KAAK;AACH,cAAA,MAAA;AAAA,YAAAM,OAAAC,OAAA;AAAAD,YAAAA,OAAAA,MAAiBN,OAAK,OAAA,KAAA;AAAAM,eAAAA;AAAAA,MAAAA,GAAA;AAAA,IACxB,KAAK;AACHJ,aAAAA,oBAAQM,KAAAA,OAAKJ,IAAAA,WAAKJ,OAAK;AAAA,QAAES,WAAWR;AAAAA,MAAAA,CAAQ,CAAA;AAAA,IAC9C,KAAK;AACED,UAAAA,SAAkBA,MAAcU,KAAK;AACxC,gBAAA,MAAA;AAAA,cAAAC,QAAAC,QAAA;AAAAD,cAAAA,OAAAA,OAAmBX,OAAK,OAAA,KAAA;AAAAW,iBAAAA;AAAAA,QAAAA,GAAA;AAAA,MAAA;AAE1B,UAAI,OAAOV,aAAa,SACtB,SAAA,MAAA;AAAA,YAAAY,QAAAD,QAAA;AAAAC,mBAAAA,OAAAT,eAAmBJ,OAAK;AAAA,UAAA,aAAaC;AAAAA,QAAAA,CAAQ,GAAA,OAAA,KAAA;AAAAY,eAAAA;AAAAA,MAAAA,GAAA;AACxC,aAAA;AAAA,IACT;AACS,aAAA;AAAA,EAAA;AAEb;;"}
|
package/dist/cjs/HeadContent.cjs
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const web = require("solid-js/web");
|
|
4
4
|
const Solid = require("solid-js");
|
|
5
|
+
const meta = require("@solidjs/meta");
|
|
5
6
|
const Asset = require("./Asset.cjs");
|
|
6
7
|
const useRouter = require("./useRouter.cjs");
|
|
7
8
|
const useRouterState = require("./useRouterState.cjs");
|
|
@@ -29,7 +30,7 @@ const useTags = () => {
|
|
|
29
30
|
return state.matches.map((match) => match.meta).filter(Boolean);
|
|
30
31
|
}
|
|
31
32
|
});
|
|
32
|
-
const
|
|
33
|
+
const meta2 = Solid__namespace.createMemo(() => {
|
|
33
34
|
const resultMeta = [];
|
|
34
35
|
const metaByAttribute = {};
|
|
35
36
|
let title;
|
|
@@ -66,7 +67,7 @@ const useTags = () => {
|
|
|
66
67
|
}
|
|
67
68
|
resultMeta.reverse();
|
|
68
69
|
return resultMeta;
|
|
69
|
-
}
|
|
70
|
+
});
|
|
70
71
|
const links = useRouterState.useRouterState({
|
|
71
72
|
select: (state) => state.matches.map((match) => match.links).filter(Boolean).flat(1).map((link) => ({
|
|
72
73
|
tag: "link",
|
|
@@ -105,13 +106,17 @@ const useTags = () => {
|
|
|
105
106
|
children
|
|
106
107
|
}))
|
|
107
108
|
});
|
|
108
|
-
return uniqBy([...
|
|
109
|
+
return () => uniqBy([...meta2(), ...preloadMeta(), ...links(), ...headScripts()], (d) => {
|
|
109
110
|
return JSON.stringify(d);
|
|
110
111
|
});
|
|
111
112
|
};
|
|
112
113
|
function HeadContent() {
|
|
113
114
|
const tags = useTags();
|
|
114
|
-
return
|
|
115
|
+
return web.createComponent(meta.MetaProvider, {
|
|
116
|
+
get children() {
|
|
117
|
+
return tags().map((tag) => web.createComponent(Asset.Asset, tag));
|
|
118
|
+
}
|
|
119
|
+
});
|
|
115
120
|
}
|
|
116
121
|
function uniqBy(arr, fn) {
|
|
117
122
|
const seen = /* @__PURE__ */ new Set();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadContent.cjs","sources":["../../src/HeadContent.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\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 ;[...routeMeta()].reverse().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 {\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 }
|
|
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 ;[...routeMeta()].reverse().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 {\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 = useRouterState({\n select: (state) =>\n 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 })) as Array<RouterManagedTag>,\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 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 ...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","reverse","forEach","metas","m","tag","children","attribute","name","property","push","attrs","links","flat","link","preloadMeta","looseRoutesById","routeId","route","ssr","manifest","routes","id","preloads","preload","rel","href","headScripts","script","uniqBy","d","JSON","stringify","HeadContent","tags","_$createComponent","MetaProvider","Asset","arr","fn","seen","Set","item","key","has","add"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { RouterManagedTag } from '@tanstack/router-core';
|
|
2
2
|
import * as Solid from 'solid-js';
|
|
3
|
-
export declare const useTags: () => RouterManagedTag[];
|
|
3
|
+
export declare const useTags: () => () => RouterManagedTag[];
|
|
4
4
|
/**
|
|
5
5
|
* @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.
|
|
6
6
|
* It should be rendered in the `<head>` of your document.
|
|
7
7
|
*/
|
|
8
|
-
export declare function HeadContent(): Solid.JSX.Element
|
|
8
|
+
export declare function HeadContent(): Solid.JSX.Element;
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -256,5 +256,6 @@ exports.notFound = notFound.notFound;
|
|
|
256
256
|
exports.ScriptOnce = ScriptOnce.ScriptOnce;
|
|
257
257
|
exports.Asset = Asset.Asset;
|
|
258
258
|
exports.HeadContent = HeadContent.HeadContent;
|
|
259
|
+
exports.useTags = HeadContent.useTags;
|
|
259
260
|
exports.Scripts = Scripts.Scripts;
|
|
260
261
|
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/cjs/index.d.cts
CHANGED
|
@@ -46,5 +46,5 @@ export type { NotFoundError } from './not-found.cjs';
|
|
|
46
46
|
export * from './typePrimitives.cjs';
|
|
47
47
|
export { ScriptOnce } from './ScriptOnce.cjs';
|
|
48
48
|
export { Asset } from './Asset.cjs';
|
|
49
|
-
export { HeadContent } from './HeadContent.cjs';
|
|
49
|
+
export { HeadContent, useTags } from './HeadContent.cjs';
|
|
50
50
|
export { Scripts } from './Scripts.cjs';
|
|
@@ -5,7 +5,11 @@ const routerCore = require("@tanstack/router-core");
|
|
|
5
5
|
const useRouter = require("./useRouter.cjs");
|
|
6
6
|
const ScriptOnce = require("./ScriptOnce.cjs");
|
|
7
7
|
const storageKey = "tsr-scroll-restoration-v1_3";
|
|
8
|
-
|
|
8
|
+
let sessionsStorage = false;
|
|
9
|
+
try {
|
|
10
|
+
sessionsStorage = typeof window !== "undefined" && typeof window.sessionStorage === "object";
|
|
11
|
+
} catch {
|
|
12
|
+
}
|
|
9
13
|
const throttle = (fn, wait) => {
|
|
10
14
|
let timeout;
|
|
11
15
|
return (...args) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-restoration.cjs","sources":["../../src/scroll-restoration.tsx"],"sourcesContent":["import { functionalUpdate } from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport { ScriptOnce } from './ScriptOnce'\nimport type { AnyRouter } from './router'\nimport type { NonNullableUpdater, ParsedLocation } from '@tanstack/router-core'\n\nexport type ScrollRestorationEntry = { scrollX: number; scrollY: number }\n\nexport type ScrollRestorationByElement = Record<string, ScrollRestorationEntry>\n\nexport type ScrollRestorationByKey = Record<string, ScrollRestorationByElement>\n\nexport type ScrollRestorationCache = {\n state: ScrollRestorationByKey\n set: (updater: NonNullableUpdater<ScrollRestorationByKey>) => void\n}\nexport type ScrollRestorationOptions = {\n getKey?: (location: ParsedLocation) => string\n scrollBehavior?: ScrollToOptions['behavior']\n}\n\nexport const storageKey = 'tsr-scroll-restoration-v1_3'\nconst sessionsStorage = typeof window !== 'undefined' && window.sessionStorage\nconst throttle = (fn: (...args: Array<any>) => void, wait: number) => {\n let timeout: any\n return (...args: Array<any>) => {\n if (!timeout) {\n timeout = setTimeout(() => {\n fn(...args)\n timeout = null\n }, wait)\n }\n }\n}\nexport const scrollRestorationCache: ScrollRestorationCache = sessionsStorage\n ? (() => {\n const state: ScrollRestorationByKey =\n JSON.parse(window.sessionStorage.getItem(storageKey) || 'null') || {}\n\n return {\n state,\n // This setter is simply to make sure that we set the sessionStorage right\n // after the state is updated. It doesn't necessarily need to be a functional\n // update.\n set: (updater) => (\n (scrollRestorationCache.state =\n functionalUpdate(updater, scrollRestorationCache.state) ||\n scrollRestorationCache.state),\n window.sessionStorage.setItem(\n storageKey,\n JSON.stringify(scrollRestorationCache.state),\n )\n ),\n }\n })()\n : (undefined as any)\n/**\n * The default `getKey` function for `useScrollRestoration`.\n * It returns the `key` from the location state or the `href` of the location.\n *\n * The `location.href` is used as a fallback to support the use case where the location state is not available like the initial render.\n */\n\nexport const defaultGetScrollRestorationKey = (location: ParsedLocation) => {\n return location.state.key! || location.href\n}\n\nexport function getCssSelector(el: any): string {\n const path = []\n let parent\n while ((parent = el.parentNode)) {\n path.unshift(\n `${el.tagName}:nth-child(${([].indexOf as any).call(parent.children, el) + 1})`,\n )\n el = parent\n }\n return `${path.join(' > ')}`.toLowerCase()\n}\n\nlet ignoreScroll = false\n\n// NOTE: This function must remain pure and not use any outside variables\n// unless they are passed in as arguments. Why? Because we need to be able to\n// toString() it into a script tag to execute as early as possible in the browser\n// during SSR. Additionally, we also call it from within the router lifecycle\nexport function restoreScroll(\n storageKey: string,\n key?: string,\n behavior?: ScrollToOptions['behavior'],\n shouldScrollRestoration?: boolean,\n scrollToTopSelectors?: Array<string>,\n) {\n let byKey: ScrollRestorationByKey\n\n try {\n byKey = JSON.parse(sessionStorage.getItem(storageKey) || '{}')\n } catch (error: any) {\n console.error(error)\n return\n }\n\n const resolvedKey = key || window.history.state?.key\n const elementEntries = byKey[resolvedKey]\n\n //\n ignoreScroll = true\n\n //\n ;(() => {\n // If we have a cached entry for this location state,\n // we always need to prefer that over the hash scroll.\n if (shouldScrollRestoration && elementEntries) {\n for (const elementSelector in elementEntries) {\n const entry = elementEntries[elementSelector]!\n if (elementSelector === 'window') {\n window.scrollTo({\n top: entry.scrollY,\n left: entry.scrollX,\n behavior,\n })\n } else if (elementSelector) {\n const element = document.querySelector(elementSelector)\n if (element) {\n element.scrollLeft = entry.scrollX\n element.scrollTop = entry.scrollY\n }\n }\n }\n\n return\n }\n\n // If we don't have a cached entry for the hash,\n // Which means we've never seen this location before,\n // we need to check if there is a hash in the URL.\n // If there is, we need to scroll it's ID into view.\n const hash = window.location.hash.split('#')[1]\n\n if (hash) {\n const hashScrollIntoViewOptions =\n (window.history.state || {}).__hashScrollIntoViewOptions ?? true\n\n if (hashScrollIntoViewOptions) {\n const el = document.getElementById(hash)\n if (el) {\n el.scrollIntoView(hashScrollIntoViewOptions)\n }\n }\n\n return\n }\n\n // If there is no cached entry for the hash and there is no hash in the URL,\n // we need to scroll to the top of the page for every scrollToTop element\n ;[\n 'window',\n ...(scrollToTopSelectors?.filter((d) => d !== 'window') ?? []),\n ].forEach((selector) => {\n const element =\n selector === 'window' ? window : document.querySelector(selector)\n if (element) {\n element.scrollTo({\n top: 0,\n left: 0,\n behavior,\n })\n }\n })\n })()\n\n //\n ignoreScroll = false\n}\n\nexport function setupScrollRestoration(router: AnyRouter, force?: boolean) {\n const shouldScrollRestoration =\n force ?? router.options.scrollRestoration ?? false\n\n if (shouldScrollRestoration) {\n router.isScrollRestoring = true\n }\n\n if (typeof document === 'undefined' || router.isScrollRestorationSetup) {\n return\n }\n\n router.isScrollRestorationSetup = true\n\n //\n ignoreScroll = false\n\n const getKey =\n router.options.getScrollRestorationKey || defaultGetScrollRestorationKey\n\n window.history.scrollRestoration = 'manual'\n\n // // Create a MutationObserver to monitor DOM changes\n // const mutationObserver = new MutationObserver(() => {\n // ;ignoreScroll = true\n // requestAnimationFrame(() => {\n // ;ignoreScroll = false\n\n // // Attempt to restore scroll position on each dom\n // // mutation until the user scrolls. We do this\n // // because dynamic content may come in at different\n // // ticks after the initial render and we want to\n // // keep up with that content as much as possible.\n // // As soon as the user scrolls, we no longer need\n // // to attempt router.\n // // console.log('mutation observer restoreScroll')\n // restoreScroll(\n // storageKey,\n // getKey(router.state.location),\n // router.options.scrollRestorationBehavior,\n // )\n // })\n // })\n\n // const observeDom = () => {\n // // Observe changes to the entire document\n // mutationObserver.observe(document, {\n // childList: true, // Detect added or removed child nodes\n // subtree: true, // Monitor all descendants\n // characterData: true, // Detect text content changes\n // })\n // }\n\n // const unobserveDom = () => {\n // mutationObserver.disconnect()\n // }\n\n // observeDom()\n\n const onScroll = (event: Event) => {\n // unobserveDom()\n\n if (ignoreScroll || !router.isScrollRestoring) {\n return\n }\n\n let elementSelector = ''\n\n if (event.target === document || event.target === window) {\n elementSelector = 'window'\n } else {\n const attrId = (event.target as Element).getAttribute(\n 'data-scroll-restoration-id',\n )\n\n if (attrId) {\n elementSelector = `[data-scroll-restoration-id=\"${attrId}\"]`\n } else {\n elementSelector = getCssSelector(event.target)\n }\n }\n\n const restoreKey = getKey(router.state.location)\n\n scrollRestorationCache.set((state) => {\n const keyEntry = (state[restoreKey] =\n state[restoreKey] || ({} as ScrollRestorationByElement))\n\n const elementEntry = (keyEntry[elementSelector] =\n keyEntry[elementSelector] || ({} as ScrollRestorationEntry))\n\n if (elementSelector === 'window') {\n elementEntry.scrollX = window.scrollX || 0\n elementEntry.scrollY = window.scrollY || 0\n } else if (elementSelector) {\n const element = document.querySelector(elementSelector)\n if (element) {\n elementEntry.scrollX = element.scrollLeft || 0\n elementEntry.scrollY = element.scrollTop || 0\n }\n }\n\n return state\n })\n }\n\n // Throttle the scroll event to avoid excessive updates\n if (typeof document !== 'undefined') {\n document.addEventListener('scroll', throttle(onScroll, 100), true)\n }\n\n router.subscribe('onRendered', (event) => {\n // unobserveDom()\n\n const cacheKey = getKey(event.toLocation)\n\n // If the user doesn't want to restore the scroll position,\n // we don't need to do anything.\n if (!router.resetNextScroll) {\n router.resetNextScroll = true\n return\n }\n\n restoreScroll(\n storageKey,\n cacheKey,\n router.options.scrollRestorationBehavior,\n router.isScrollRestoring,\n router.options.scrollToTopSelectors,\n )\n\n if (router.isScrollRestoring) {\n // Mark the location as having been seen\n scrollRestorationCache.set((state) => {\n state[cacheKey] = state[cacheKey] || ({} as ScrollRestorationByElement)\n\n return state\n })\n }\n })\n}\n\nexport function ScrollRestoration() {\n const router = useRouter()\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 : null\n\n if (!router.isScrollRestoring || !router.isServer) {\n return null\n }\n\n return (\n <ScriptOnce\n children={`(${restoreScroll.toString()})(${JSON.stringify(storageKey)},${JSON.stringify(resolvedKey)}, undefined, true)`}\n log={false}\n />\n )\n}\n"],"names":["storageKey","sessionsStorage","window","sessionStorage","throttle","fn","wait","timeout","args","setTimeout","scrollRestorationCache","state","JSON","parse","getItem","set","updater","functionalUpdate","setItem","stringify","undefined","defaultGetScrollRestorationKey","location","key","href","getCssSelector","el","path","parent","parentNode","unshift","tagName","indexOf","call","children","join","toLowerCase","ignoreScroll","restoreScroll","behavior","shouldScrollRestoration","scrollToTopSelectors","byKey","error","console","resolvedKey","history","elementEntries","elementSelector","entry","scrollTo","top","scrollY","left","scrollX","element","document","querySelector","scrollLeft","scrollTop","hash","split","hashScrollIntoViewOptions","__hashScrollIntoViewOptions","getElementById","scrollIntoView","filter","d","forEach","selector","setupScrollRestoration","router","force","options","scrollRestoration","isScrollRestoring","isScrollRestorationSetup","getKey","getScrollRestorationKey","onScroll","event","target","attrId","getAttribute","restoreKey","keyEntry","elementEntry","addEventListener","subscribe","cacheKey","toLocation","resetNextScroll","scrollRestorationBehavior","ScrollRestoration","useRouter","userKey","latestLocation","isServer","_$createComponent","ScriptOnce","toString","log"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scroll-restoration.cjs","sources":["../../src/scroll-restoration.tsx"],"sourcesContent":["import { functionalUpdate } from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport { ScriptOnce } from './ScriptOnce'\nimport type { AnyRouter } from './router'\nimport type { NonNullableUpdater, ParsedLocation } from '@tanstack/router-core'\n\nexport type ScrollRestorationEntry = { scrollX: number; scrollY: number }\n\nexport type ScrollRestorationByElement = Record<string, ScrollRestorationEntry>\n\nexport type ScrollRestorationByKey = Record<string, ScrollRestorationByElement>\n\nexport type ScrollRestorationCache = {\n state: ScrollRestorationByKey\n set: (updater: NonNullableUpdater<ScrollRestorationByKey>) => void\n}\nexport type ScrollRestorationOptions = {\n getKey?: (location: ParsedLocation) => string\n scrollBehavior?: ScrollToOptions['behavior']\n}\n\nexport const storageKey = 'tsr-scroll-restoration-v1_3'\nlet sessionsStorage = false\ntry {\n sessionsStorage =\n typeof window !== 'undefined' && typeof window.sessionStorage === 'object'\n} catch {}\nconst throttle = (fn: (...args: Array<any>) => void, wait: number) => {\n let timeout: any\n return (...args: Array<any>) => {\n if (!timeout) {\n timeout = setTimeout(() => {\n fn(...args)\n timeout = null\n }, wait)\n }\n }\n}\nexport const scrollRestorationCache: ScrollRestorationCache = sessionsStorage\n ? (() => {\n const state: ScrollRestorationByKey =\n JSON.parse(window.sessionStorage.getItem(storageKey) || 'null') || {}\n\n return {\n state,\n // This setter is simply to make sure that we set the sessionStorage right\n // after the state is updated. It doesn't necessarily need to be a functional\n // update.\n set: (updater) => (\n (scrollRestorationCache.state =\n functionalUpdate(updater, scrollRestorationCache.state) ||\n scrollRestorationCache.state),\n window.sessionStorage.setItem(\n storageKey,\n JSON.stringify(scrollRestorationCache.state),\n )\n ),\n }\n })()\n : (undefined as any)\n/**\n * The default `getKey` function for `useScrollRestoration`.\n * It returns the `key` from the location state or the `href` of the location.\n *\n * The `location.href` is used as a fallback to support the use case where the location state is not available like the initial render.\n */\n\nexport const defaultGetScrollRestorationKey = (location: ParsedLocation) => {\n return location.state.key! || location.href\n}\n\nexport function getCssSelector(el: any): string {\n const path = []\n let parent\n while ((parent = el.parentNode)) {\n path.unshift(\n `${el.tagName}:nth-child(${([].indexOf as any).call(parent.children, el) + 1})`,\n )\n el = parent\n }\n return `${path.join(' > ')}`.toLowerCase()\n}\n\nlet ignoreScroll = false\n\n// NOTE: This function must remain pure and not use any outside variables\n// unless they are passed in as arguments. Why? Because we need to be able to\n// toString() it into a script tag to execute as early as possible in the browser\n// during SSR. Additionally, we also call it from within the router lifecycle\nexport function restoreScroll(\n storageKey: string,\n key?: string,\n behavior?: ScrollToOptions['behavior'],\n shouldScrollRestoration?: boolean,\n scrollToTopSelectors?: Array<string>,\n) {\n let byKey: ScrollRestorationByKey\n\n try {\n byKey = JSON.parse(sessionStorage.getItem(storageKey) || '{}')\n } catch (error: any) {\n console.error(error)\n return\n }\n\n const resolvedKey = key || window.history.state?.key\n const elementEntries = byKey[resolvedKey]\n\n //\n ignoreScroll = true\n\n //\n ;(() => {\n // If we have a cached entry for this location state,\n // we always need to prefer that over the hash scroll.\n if (shouldScrollRestoration && elementEntries) {\n for (const elementSelector in elementEntries) {\n const entry = elementEntries[elementSelector]!\n if (elementSelector === 'window') {\n window.scrollTo({\n top: entry.scrollY,\n left: entry.scrollX,\n behavior,\n })\n } else if (elementSelector) {\n const element = document.querySelector(elementSelector)\n if (element) {\n element.scrollLeft = entry.scrollX\n element.scrollTop = entry.scrollY\n }\n }\n }\n\n return\n }\n\n // If we don't have a cached entry for the hash,\n // Which means we've never seen this location before,\n // we need to check if there is a hash in the URL.\n // If there is, we need to scroll it's ID into view.\n const hash = window.location.hash.split('#')[1]\n\n if (hash) {\n const hashScrollIntoViewOptions =\n (window.history.state || {}).__hashScrollIntoViewOptions ?? true\n\n if (hashScrollIntoViewOptions) {\n const el = document.getElementById(hash)\n if (el) {\n el.scrollIntoView(hashScrollIntoViewOptions)\n }\n }\n\n return\n }\n\n // If there is no cached entry for the hash and there is no hash in the URL,\n // we need to scroll to the top of the page for every scrollToTop element\n ;[\n 'window',\n ...(scrollToTopSelectors?.filter((d) => d !== 'window') ?? []),\n ].forEach((selector) => {\n const element =\n selector === 'window' ? window : document.querySelector(selector)\n if (element) {\n element.scrollTo({\n top: 0,\n left: 0,\n behavior,\n })\n }\n })\n })()\n\n //\n ignoreScroll = false\n}\n\nexport function setupScrollRestoration(router: AnyRouter, force?: boolean) {\n const shouldScrollRestoration =\n force ?? router.options.scrollRestoration ?? false\n\n if (shouldScrollRestoration) {\n router.isScrollRestoring = true\n }\n\n if (typeof document === 'undefined' || router.isScrollRestorationSetup) {\n return\n }\n\n router.isScrollRestorationSetup = true\n\n //\n ignoreScroll = false\n\n const getKey =\n router.options.getScrollRestorationKey || defaultGetScrollRestorationKey\n\n window.history.scrollRestoration = 'manual'\n\n // // Create a MutationObserver to monitor DOM changes\n // const mutationObserver = new MutationObserver(() => {\n // ;ignoreScroll = true\n // requestAnimationFrame(() => {\n // ;ignoreScroll = false\n\n // // Attempt to restore scroll position on each dom\n // // mutation until the user scrolls. We do this\n // // because dynamic content may come in at different\n // // ticks after the initial render and we want to\n // // keep up with that content as much as possible.\n // // As soon as the user scrolls, we no longer need\n // // to attempt router.\n // // console.log('mutation observer restoreScroll')\n // restoreScroll(\n // storageKey,\n // getKey(router.state.location),\n // router.options.scrollRestorationBehavior,\n // )\n // })\n // })\n\n // const observeDom = () => {\n // // Observe changes to the entire document\n // mutationObserver.observe(document, {\n // childList: true, // Detect added or removed child nodes\n // subtree: true, // Monitor all descendants\n // characterData: true, // Detect text content changes\n // })\n // }\n\n // const unobserveDom = () => {\n // mutationObserver.disconnect()\n // }\n\n // observeDom()\n\n const onScroll = (event: Event) => {\n // unobserveDom()\n\n if (ignoreScroll || !router.isScrollRestoring) {\n return\n }\n\n let elementSelector = ''\n\n if (event.target === document || event.target === window) {\n elementSelector = 'window'\n } else {\n const attrId = (event.target as Element).getAttribute(\n 'data-scroll-restoration-id',\n )\n\n if (attrId) {\n elementSelector = `[data-scroll-restoration-id=\"${attrId}\"]`\n } else {\n elementSelector = getCssSelector(event.target)\n }\n }\n\n const restoreKey = getKey(router.state.location)\n\n scrollRestorationCache.set((state) => {\n const keyEntry = (state[restoreKey] =\n state[restoreKey] || ({} as ScrollRestorationByElement))\n\n const elementEntry = (keyEntry[elementSelector] =\n keyEntry[elementSelector] || ({} as ScrollRestorationEntry))\n\n if (elementSelector === 'window') {\n elementEntry.scrollX = window.scrollX || 0\n elementEntry.scrollY = window.scrollY || 0\n } else if (elementSelector) {\n const element = document.querySelector(elementSelector)\n if (element) {\n elementEntry.scrollX = element.scrollLeft || 0\n elementEntry.scrollY = element.scrollTop || 0\n }\n }\n\n return state\n })\n }\n\n // Throttle the scroll event to avoid excessive updates\n if (typeof document !== 'undefined') {\n document.addEventListener('scroll', throttle(onScroll, 100), true)\n }\n\n router.subscribe('onRendered', (event) => {\n // unobserveDom()\n\n const cacheKey = getKey(event.toLocation)\n\n // If the user doesn't want to restore the scroll position,\n // we don't need to do anything.\n if (!router.resetNextScroll) {\n router.resetNextScroll = true\n return\n }\n\n restoreScroll(\n storageKey,\n cacheKey,\n router.options.scrollRestorationBehavior,\n router.isScrollRestoring,\n router.options.scrollToTopSelectors,\n )\n\n if (router.isScrollRestoring) {\n // Mark the location as having been seen\n scrollRestorationCache.set((state) => {\n state[cacheKey] = state[cacheKey] || ({} as ScrollRestorationByElement)\n\n return state\n })\n }\n })\n}\n\nexport function ScrollRestoration() {\n const router = useRouter()\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 : null\n\n if (!router.isScrollRestoring || !router.isServer) {\n return null\n }\n\n return (\n <ScriptOnce\n children={`(${restoreScroll.toString()})(${JSON.stringify(storageKey)},${JSON.stringify(resolvedKey)}, undefined, true)`}\n log={false}\n />\n )\n}\n"],"names":["storageKey","sessionsStorage","window","sessionStorage","throttle","fn","wait","timeout","args","setTimeout","scrollRestorationCache","state","JSON","parse","getItem","set","updater","functionalUpdate","setItem","stringify","undefined","defaultGetScrollRestorationKey","location","key","href","getCssSelector","el","path","parent","parentNode","unshift","tagName","indexOf","call","children","join","toLowerCase","ignoreScroll","restoreScroll","behavior","shouldScrollRestoration","scrollToTopSelectors","byKey","error","console","resolvedKey","history","elementEntries","elementSelector","entry","scrollTo","top","scrollY","left","scrollX","element","document","querySelector","scrollLeft","scrollTop","hash","split","hashScrollIntoViewOptions","__hashScrollIntoViewOptions","getElementById","scrollIntoView","filter","d","forEach","selector","setupScrollRestoration","router","force","options","scrollRestoration","isScrollRestoring","isScrollRestorationSetup","getKey","getScrollRestorationKey","onScroll","event","target","attrId","getAttribute","restoreKey","keyEntry","elementEntry","addEventListener","subscribe","cacheKey","toLocation","resetNextScroll","scrollRestorationBehavior","ScrollRestoration","useRouter","userKey","latestLocation","isServer","_$createComponent","ScriptOnce","toString","log"],"mappings":"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"}
|
package/dist/esm/Asset.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { template, spread, mergeProps,
|
|
2
|
-
|
|
1
|
+
import { template, spread, mergeProps, createComponent } from "solid-js/web";
|
|
2
|
+
import { Style, Meta, Title } from "@solidjs/meta";
|
|
3
|
+
var _tmpl$ = /* @__PURE__ */ template(`<link>`), _tmpl$2 = /* @__PURE__ */ template(`<script>`);
|
|
3
4
|
function Asset({
|
|
4
5
|
tag,
|
|
5
6
|
attrs,
|
|
@@ -7,46 +8,35 @@ function Asset({
|
|
|
7
8
|
}) {
|
|
8
9
|
switch (tag) {
|
|
9
10
|
case "title":
|
|
10
|
-
return ((
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
insert(_el$, children);
|
|
14
|
-
return _el$;
|
|
15
|
-
})();
|
|
11
|
+
return createComponent(Title, mergeProps(attrs, {
|
|
12
|
+
children
|
|
13
|
+
}));
|
|
16
14
|
case "meta":
|
|
17
|
-
return (
|
|
18
|
-
var _el$2 = _tmpl$2();
|
|
19
|
-
spread(_el$2, attrs, false, false);
|
|
20
|
-
return _el$2;
|
|
21
|
-
})();
|
|
15
|
+
return createComponent(Meta, attrs);
|
|
22
16
|
case "link":
|
|
23
17
|
return (() => {
|
|
24
|
-
var _el$
|
|
25
|
-
spread(_el
|
|
26
|
-
return _el
|
|
18
|
+
var _el$ = _tmpl$();
|
|
19
|
+
spread(_el$, attrs, false, false);
|
|
20
|
+
return _el$;
|
|
27
21
|
})();
|
|
28
22
|
case "style":
|
|
29
|
-
return ((
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"innerHTML": children
|
|
33
|
-
}), false, false);
|
|
34
|
-
return _el$4;
|
|
35
|
-
})();
|
|
23
|
+
return createComponent(Style, mergeProps(attrs, {
|
|
24
|
+
innerHTML: children
|
|
25
|
+
}));
|
|
36
26
|
case "script":
|
|
37
27
|
if (attrs && attrs.src) {
|
|
38
28
|
return (() => {
|
|
39
|
-
var _el$
|
|
40
|
-
spread(_el$
|
|
41
|
-
return _el$
|
|
29
|
+
var _el$2 = _tmpl$2();
|
|
30
|
+
spread(_el$2, attrs, false, false);
|
|
31
|
+
return _el$2;
|
|
42
32
|
})();
|
|
43
33
|
}
|
|
44
34
|
if (typeof children === "string") return (() => {
|
|
45
|
-
var _el$
|
|
46
|
-
spread(_el$
|
|
35
|
+
var _el$3 = _tmpl$2();
|
|
36
|
+
spread(_el$3, mergeProps(attrs, {
|
|
47
37
|
"innerHTML": children
|
|
48
38
|
}), false, false);
|
|
49
|
-
return _el$
|
|
39
|
+
return _el$3;
|
|
50
40
|
})();
|
|
51
41
|
return null;
|
|
52
42
|
default:
|
package/dist/esm/Asset.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Asset.js","sources":["../../src/Asset.tsx"],"sourcesContent":["import type { RouterManagedTag } from '@tanstack/router-core'\n\nexport function Asset({ tag, attrs, children }: RouterManagedTag): any {\n switch (tag) {\n case 'title':\n return <
|
|
1
|
+
{"version":3,"file":"Asset.js","sources":["../../src/Asset.tsx"],"sourcesContent":["import { Meta, Style, Title } from '@solidjs/meta'\nimport type { RouterManagedTag } from '@tanstack/router-core'\n\nexport function Asset({ tag, attrs, children }: RouterManagedTag): any {\n switch (tag) {\n case 'title':\n return <Title {...attrs}>{children}</Title>\n case 'meta':\n return <Meta {...attrs} />\n case 'link':\n return <link {...attrs} />\n case 'style':\n return <Style {...attrs} innerHTML={children} />\n case 'script':\n if ((attrs as any) && (attrs as any).src) {\n return <script {...attrs} />\n }\n if (typeof children === 'string')\n return <script {...attrs} innerHTML={children} />\n return null\n default:\n return null\n }\n}\n"],"names":["Asset","tag","attrs","children","_$createComponent","Title","_$mergeProps","Meta","_el$","_tmpl$","Style","innerHTML","src","_el$2","_tmpl$2","_el$3"],"mappings":";;;AAGO,SAASA,MAAM;AAAA,EAAEC;AAAAA,EAAKC;AAAAA,EAAOC;AAA2B,GAAQ;AACrE,UAAQF,KAAG;AAAA,IACT,KAAK;AACHG,aAAAA,gBAAQC,OAAKC,WAAKJ,OAAK;AAAA,QAAAC;AAAAA,MAAAA,CAAW,CAAA;AAAA,IACpC,KAAK;AACHC,aAAAA,gBAAQG,MAASL,KAAK;AAAA,IACxB,KAAK;AACH,cAAA,MAAA;AAAA,YAAAM,OAAAC,OAAA;AAAAD,eAAAA,MAAiBN,OAAK,OAAA,KAAA;AAAAM,eAAAA;AAAAA,MAAAA,GAAA;AAAA,IACxB,KAAK;AACHJ,aAAAA,gBAAQM,OAAKJ,WAAKJ,OAAK;AAAA,QAAES,WAAWR;AAAAA,MAAAA,CAAQ,CAAA;AAAA,IAC9C,KAAK;AACED,UAAAA,SAAkBA,MAAcU,KAAK;AACxC,gBAAA,MAAA;AAAA,cAAAC,QAAAC,QAAA;AAAAD,iBAAAA,OAAmBX,OAAK,OAAA,KAAA;AAAAW,iBAAAA;AAAAA,QAAAA,GAAA;AAAA,MAAA;AAE1B,UAAI,OAAOV,aAAa,SACtB,SAAA,MAAA;AAAA,YAAAY,QAAAD,QAAA;AAAAC,eAAAA,OAAAT,WAAmBJ,OAAK;AAAA,UAAA,aAAaC;AAAAA,QAAAA,CAAQ,GAAA,OAAA,KAAA;AAAAY,eAAAA;AAAAA,MAAAA,GAAA;AACxC,aAAA;AAAA,IACT;AACS,aAAA;AAAA,EAAA;AAEb;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { RouterManagedTag } from '@tanstack/router-core';
|
|
2
2
|
import * as Solid from 'solid-js';
|
|
3
|
-
export declare const useTags: () => RouterManagedTag[];
|
|
3
|
+
export declare const useTags: () => () => RouterManagedTag[];
|
|
4
4
|
/**
|
|
5
5
|
* @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.
|
|
6
6
|
* It should be rendered in the `<head>` of your document.
|
|
7
7
|
*/
|
|
8
|
-
export declare function HeadContent(): Solid.JSX.Element
|
|
8
|
+
export declare function HeadContent(): Solid.JSX.Element;
|
package/dist/esm/HeadContent.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createComponent } from "solid-js/web";
|
|
2
2
|
import * as Solid from "solid-js";
|
|
3
|
+
import { MetaProvider } from "@solidjs/meta";
|
|
3
4
|
import { Asset } from "./Asset.js";
|
|
4
5
|
import { useRouter } from "./useRouter.js";
|
|
5
6
|
import { useRouterState } from "./useRouterState.js";
|
|
@@ -47,7 +48,7 @@ const useTags = () => {
|
|
|
47
48
|
}
|
|
48
49
|
resultMeta.reverse();
|
|
49
50
|
return resultMeta;
|
|
50
|
-
}
|
|
51
|
+
});
|
|
51
52
|
const links = useRouterState({
|
|
52
53
|
select: (state) => state.matches.map((match) => match.links).filter(Boolean).flat(1).map((link) => ({
|
|
53
54
|
tag: "link",
|
|
@@ -86,13 +87,17 @@ const useTags = () => {
|
|
|
86
87
|
children
|
|
87
88
|
}))
|
|
88
89
|
});
|
|
89
|
-
return uniqBy([...meta(), ...preloadMeta(), ...links(), ...headScripts()], (d) => {
|
|
90
|
+
return () => uniqBy([...meta(), ...preloadMeta(), ...links(), ...headScripts()], (d) => {
|
|
90
91
|
return JSON.stringify(d);
|
|
91
92
|
});
|
|
92
93
|
};
|
|
93
94
|
function HeadContent() {
|
|
94
95
|
const tags = useTags();
|
|
95
|
-
return
|
|
96
|
+
return createComponent(MetaProvider, {
|
|
97
|
+
get children() {
|
|
98
|
+
return tags().map((tag) => createComponent(Asset, tag));
|
|
99
|
+
}
|
|
100
|
+
});
|
|
96
101
|
}
|
|
97
102
|
function uniqBy(arr, fn) {
|
|
98
103
|
const seen = /* @__PURE__ */ new Set();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeadContent.js","sources":["../../src/HeadContent.tsx"],"sourcesContent":["import * as Solid from 'solid-js'\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 ;[...routeMeta()].reverse().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 {\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 }
|
|
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 ;[...routeMeta()].reverse().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 {\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 = useRouterState({\n select: (state) =>\n 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 })) as Array<RouterManagedTag>,\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 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 ...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","reverse","forEach","metas","m","tag","children","attribute","name","property","push","attrs","links","flat","link","preloadMeta","looseRoutesById","routeId","route","ssr","manifest","routes","id","preloads","preload","rel","href","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/index.d.ts
CHANGED
|
@@ -46,5 +46,5 @@ export type { NotFoundError } from './not-found.js';
|
|
|
46
46
|
export * from './typePrimitives.js';
|
|
47
47
|
export { ScriptOnce } from './ScriptOnce.js';
|
|
48
48
|
export { Asset } from './Asset.js';
|
|
49
|
-
export { HeadContent } from './HeadContent.js';
|
|
49
|
+
export { HeadContent, useTags } from './HeadContent.js';
|
|
50
50
|
export { Scripts } from './Scripts.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -32,7 +32,7 @@ import { useLayoutEffect } from "./utils.js";
|
|
|
32
32
|
import { CatchNotFound, DefaultGlobalNotFound, isNotFound, notFound } from "./not-found.js";
|
|
33
33
|
import { ScriptOnce } from "./ScriptOnce.js";
|
|
34
34
|
import { Asset } from "./Asset.js";
|
|
35
|
-
import { HeadContent } from "./HeadContent.js";
|
|
35
|
+
import { HeadContent, useTags } from "./HeadContent.js";
|
|
36
36
|
import { Scripts } from "./Scripts.js";
|
|
37
37
|
export {
|
|
38
38
|
Asset,
|
|
@@ -144,6 +144,7 @@ export {
|
|
|
144
144
|
useRouter,
|
|
145
145
|
useRouterState,
|
|
146
146
|
useSearch,
|
|
147
|
+
useTags,
|
|
147
148
|
default3 as warning
|
|
148
149
|
};
|
|
149
150
|
//# sourceMappingURL=index.js.map
|
|
@@ -3,7 +3,11 @@ import { functionalUpdate } from "@tanstack/router-core";
|
|
|
3
3
|
import { useRouter } from "./useRouter.js";
|
|
4
4
|
import { ScriptOnce } from "./ScriptOnce.js";
|
|
5
5
|
const storageKey = "tsr-scroll-restoration-v1_3";
|
|
6
|
-
|
|
6
|
+
let sessionsStorage = false;
|
|
7
|
+
try {
|
|
8
|
+
sessionsStorage = typeof window !== "undefined" && typeof window.sessionStorage === "object";
|
|
9
|
+
} catch {
|
|
10
|
+
}
|
|
7
11
|
const throttle = (fn, wait) => {
|
|
8
12
|
let timeout;
|
|
9
13
|
return (...args) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-restoration.js","sources":["../../src/scroll-restoration.tsx"],"sourcesContent":["import { functionalUpdate } from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport { ScriptOnce } from './ScriptOnce'\nimport type { AnyRouter } from './router'\nimport type { NonNullableUpdater, ParsedLocation } from '@tanstack/router-core'\n\nexport type ScrollRestorationEntry = { scrollX: number; scrollY: number }\n\nexport type ScrollRestorationByElement = Record<string, ScrollRestorationEntry>\n\nexport type ScrollRestorationByKey = Record<string, ScrollRestorationByElement>\n\nexport type ScrollRestorationCache = {\n state: ScrollRestorationByKey\n set: (updater: NonNullableUpdater<ScrollRestorationByKey>) => void\n}\nexport type ScrollRestorationOptions = {\n getKey?: (location: ParsedLocation) => string\n scrollBehavior?: ScrollToOptions['behavior']\n}\n\nexport const storageKey = 'tsr-scroll-restoration-v1_3'\nconst sessionsStorage = typeof window !== 'undefined' && window.sessionStorage\nconst throttle = (fn: (...args: Array<any>) => void, wait: number) => {\n let timeout: any\n return (...args: Array<any>) => {\n if (!timeout) {\n timeout = setTimeout(() => {\n fn(...args)\n timeout = null\n }, wait)\n }\n }\n}\nexport const scrollRestorationCache: ScrollRestorationCache = sessionsStorage\n ? (() => {\n const state: ScrollRestorationByKey =\n JSON.parse(window.sessionStorage.getItem(storageKey) || 'null') || {}\n\n return {\n state,\n // This setter is simply to make sure that we set the sessionStorage right\n // after the state is updated. It doesn't necessarily need to be a functional\n // update.\n set: (updater) => (\n (scrollRestorationCache.state =\n functionalUpdate(updater, scrollRestorationCache.state) ||\n scrollRestorationCache.state),\n window.sessionStorage.setItem(\n storageKey,\n JSON.stringify(scrollRestorationCache.state),\n )\n ),\n }\n })()\n : (undefined as any)\n/**\n * The default `getKey` function for `useScrollRestoration`.\n * It returns the `key` from the location state or the `href` of the location.\n *\n * The `location.href` is used as a fallback to support the use case where the location state is not available like the initial render.\n */\n\nexport const defaultGetScrollRestorationKey = (location: ParsedLocation) => {\n return location.state.key! || location.href\n}\n\nexport function getCssSelector(el: any): string {\n const path = []\n let parent\n while ((parent = el.parentNode)) {\n path.unshift(\n `${el.tagName}:nth-child(${([].indexOf as any).call(parent.children, el) + 1})`,\n )\n el = parent\n }\n return `${path.join(' > ')}`.toLowerCase()\n}\n\nlet ignoreScroll = false\n\n// NOTE: This function must remain pure and not use any outside variables\n// unless they are passed in as arguments. Why? Because we need to be able to\n// toString() it into a script tag to execute as early as possible in the browser\n// during SSR. Additionally, we also call it from within the router lifecycle\nexport function restoreScroll(\n storageKey: string,\n key?: string,\n behavior?: ScrollToOptions['behavior'],\n shouldScrollRestoration?: boolean,\n scrollToTopSelectors?: Array<string>,\n) {\n let byKey: ScrollRestorationByKey\n\n try {\n byKey = JSON.parse(sessionStorage.getItem(storageKey) || '{}')\n } catch (error: any) {\n console.error(error)\n return\n }\n\n const resolvedKey = key || window.history.state?.key\n const elementEntries = byKey[resolvedKey]\n\n //\n ignoreScroll = true\n\n //\n ;(() => {\n // If we have a cached entry for this location state,\n // we always need to prefer that over the hash scroll.\n if (shouldScrollRestoration && elementEntries) {\n for (const elementSelector in elementEntries) {\n const entry = elementEntries[elementSelector]!\n if (elementSelector === 'window') {\n window.scrollTo({\n top: entry.scrollY,\n left: entry.scrollX,\n behavior,\n })\n } else if (elementSelector) {\n const element = document.querySelector(elementSelector)\n if (element) {\n element.scrollLeft = entry.scrollX\n element.scrollTop = entry.scrollY\n }\n }\n }\n\n return\n }\n\n // If we don't have a cached entry for the hash,\n // Which means we've never seen this location before,\n // we need to check if there is a hash in the URL.\n // If there is, we need to scroll it's ID into view.\n const hash = window.location.hash.split('#')[1]\n\n if (hash) {\n const hashScrollIntoViewOptions =\n (window.history.state || {}).__hashScrollIntoViewOptions ?? true\n\n if (hashScrollIntoViewOptions) {\n const el = document.getElementById(hash)\n if (el) {\n el.scrollIntoView(hashScrollIntoViewOptions)\n }\n }\n\n return\n }\n\n // If there is no cached entry for the hash and there is no hash in the URL,\n // we need to scroll to the top of the page for every scrollToTop element\n ;[\n 'window',\n ...(scrollToTopSelectors?.filter((d) => d !== 'window') ?? []),\n ].forEach((selector) => {\n const element =\n selector === 'window' ? window : document.querySelector(selector)\n if (element) {\n element.scrollTo({\n top: 0,\n left: 0,\n behavior,\n })\n }\n })\n })()\n\n //\n ignoreScroll = false\n}\n\nexport function setupScrollRestoration(router: AnyRouter, force?: boolean) {\n const shouldScrollRestoration =\n force ?? router.options.scrollRestoration ?? false\n\n if (shouldScrollRestoration) {\n router.isScrollRestoring = true\n }\n\n if (typeof document === 'undefined' || router.isScrollRestorationSetup) {\n return\n }\n\n router.isScrollRestorationSetup = true\n\n //\n ignoreScroll = false\n\n const getKey =\n router.options.getScrollRestorationKey || defaultGetScrollRestorationKey\n\n window.history.scrollRestoration = 'manual'\n\n // // Create a MutationObserver to monitor DOM changes\n // const mutationObserver = new MutationObserver(() => {\n // ;ignoreScroll = true\n // requestAnimationFrame(() => {\n // ;ignoreScroll = false\n\n // // Attempt to restore scroll position on each dom\n // // mutation until the user scrolls. We do this\n // // because dynamic content may come in at different\n // // ticks after the initial render and we want to\n // // keep up with that content as much as possible.\n // // As soon as the user scrolls, we no longer need\n // // to attempt router.\n // // console.log('mutation observer restoreScroll')\n // restoreScroll(\n // storageKey,\n // getKey(router.state.location),\n // router.options.scrollRestorationBehavior,\n // )\n // })\n // })\n\n // const observeDom = () => {\n // // Observe changes to the entire document\n // mutationObserver.observe(document, {\n // childList: true, // Detect added or removed child nodes\n // subtree: true, // Monitor all descendants\n // characterData: true, // Detect text content changes\n // })\n // }\n\n // const unobserveDom = () => {\n // mutationObserver.disconnect()\n // }\n\n // observeDom()\n\n const onScroll = (event: Event) => {\n // unobserveDom()\n\n if (ignoreScroll || !router.isScrollRestoring) {\n return\n }\n\n let elementSelector = ''\n\n if (event.target === document || event.target === window) {\n elementSelector = 'window'\n } else {\n const attrId = (event.target as Element).getAttribute(\n 'data-scroll-restoration-id',\n )\n\n if (attrId) {\n elementSelector = `[data-scroll-restoration-id=\"${attrId}\"]`\n } else {\n elementSelector = getCssSelector(event.target)\n }\n }\n\n const restoreKey = getKey(router.state.location)\n\n scrollRestorationCache.set((state) => {\n const keyEntry = (state[restoreKey] =\n state[restoreKey] || ({} as ScrollRestorationByElement))\n\n const elementEntry = (keyEntry[elementSelector] =\n keyEntry[elementSelector] || ({} as ScrollRestorationEntry))\n\n if (elementSelector === 'window') {\n elementEntry.scrollX = window.scrollX || 0\n elementEntry.scrollY = window.scrollY || 0\n } else if (elementSelector) {\n const element = document.querySelector(elementSelector)\n if (element) {\n elementEntry.scrollX = element.scrollLeft || 0\n elementEntry.scrollY = element.scrollTop || 0\n }\n }\n\n return state\n })\n }\n\n // Throttle the scroll event to avoid excessive updates\n if (typeof document !== 'undefined') {\n document.addEventListener('scroll', throttle(onScroll, 100), true)\n }\n\n router.subscribe('onRendered', (event) => {\n // unobserveDom()\n\n const cacheKey = getKey(event.toLocation)\n\n // If the user doesn't want to restore the scroll position,\n // we don't need to do anything.\n if (!router.resetNextScroll) {\n router.resetNextScroll = true\n return\n }\n\n restoreScroll(\n storageKey,\n cacheKey,\n router.options.scrollRestorationBehavior,\n router.isScrollRestoring,\n router.options.scrollToTopSelectors,\n )\n\n if (router.isScrollRestoring) {\n // Mark the location as having been seen\n scrollRestorationCache.set((state) => {\n state[cacheKey] = state[cacheKey] || ({} as ScrollRestorationByElement)\n\n return state\n })\n }\n })\n}\n\nexport function ScrollRestoration() {\n const router = useRouter()\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 : null\n\n if (!router.isScrollRestoring || !router.isServer) {\n return null\n }\n\n return (\n <ScriptOnce\n children={`(${restoreScroll.toString()})(${JSON.stringify(storageKey)},${JSON.stringify(resolvedKey)}, undefined, true)`}\n log={false}\n />\n )\n}\n"],"names":["storageKey","sessionsStorage","window","sessionStorage","throttle","fn","wait","timeout","args","setTimeout","scrollRestorationCache","state","JSON","parse","getItem","set","updater","functionalUpdate","setItem","stringify","undefined","defaultGetScrollRestorationKey","location","key","href","getCssSelector","el","path","parent","parentNode","unshift","tagName","indexOf","call","children","join","toLowerCase","ignoreScroll","restoreScroll","behavior","shouldScrollRestoration","scrollToTopSelectors","byKey","error","console","resolvedKey","history","elementEntries","elementSelector","entry","scrollTo","top","scrollY","left","scrollX","element","document","querySelector","scrollLeft","scrollTop","hash","split","hashScrollIntoViewOptions","__hashScrollIntoViewOptions","getElementById","scrollIntoView","filter","d","forEach","selector","setupScrollRestoration","router","force","options","scrollRestoration","isScrollRestoring","isScrollRestorationSetup","getKey","getScrollRestorationKey","onScroll","event","target","attrId","getAttribute","restoreKey","keyEntry","elementEntry","addEventListener","subscribe","cacheKey","toLocation","resetNextScroll","scrollRestorationBehavior","ScrollRestoration","useRouter","userKey","latestLocation","isServer","_$createComponent","ScriptOnce","toString","log"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scroll-restoration.js","sources":["../../src/scroll-restoration.tsx"],"sourcesContent":["import { functionalUpdate } from '@tanstack/router-core'\nimport { useRouter } from './useRouter'\nimport { ScriptOnce } from './ScriptOnce'\nimport type { AnyRouter } from './router'\nimport type { NonNullableUpdater, ParsedLocation } from '@tanstack/router-core'\n\nexport type ScrollRestorationEntry = { scrollX: number; scrollY: number }\n\nexport type ScrollRestorationByElement = Record<string, ScrollRestorationEntry>\n\nexport type ScrollRestorationByKey = Record<string, ScrollRestorationByElement>\n\nexport type ScrollRestorationCache = {\n state: ScrollRestorationByKey\n set: (updater: NonNullableUpdater<ScrollRestorationByKey>) => void\n}\nexport type ScrollRestorationOptions = {\n getKey?: (location: ParsedLocation) => string\n scrollBehavior?: ScrollToOptions['behavior']\n}\n\nexport const storageKey = 'tsr-scroll-restoration-v1_3'\nlet sessionsStorage = false\ntry {\n sessionsStorage =\n typeof window !== 'undefined' && typeof window.sessionStorage === 'object'\n} catch {}\nconst throttle = (fn: (...args: Array<any>) => void, wait: number) => {\n let timeout: any\n return (...args: Array<any>) => {\n if (!timeout) {\n timeout = setTimeout(() => {\n fn(...args)\n timeout = null\n }, wait)\n }\n }\n}\nexport const scrollRestorationCache: ScrollRestorationCache = sessionsStorage\n ? (() => {\n const state: ScrollRestorationByKey =\n JSON.parse(window.sessionStorage.getItem(storageKey) || 'null') || {}\n\n return {\n state,\n // This setter is simply to make sure that we set the sessionStorage right\n // after the state is updated. It doesn't necessarily need to be a functional\n // update.\n set: (updater) => (\n (scrollRestorationCache.state =\n functionalUpdate(updater, scrollRestorationCache.state) ||\n scrollRestorationCache.state),\n window.sessionStorage.setItem(\n storageKey,\n JSON.stringify(scrollRestorationCache.state),\n )\n ),\n }\n })()\n : (undefined as any)\n/**\n * The default `getKey` function for `useScrollRestoration`.\n * It returns the `key` from the location state or the `href` of the location.\n *\n * The `location.href` is used as a fallback to support the use case where the location state is not available like the initial render.\n */\n\nexport const defaultGetScrollRestorationKey = (location: ParsedLocation) => {\n return location.state.key! || location.href\n}\n\nexport function getCssSelector(el: any): string {\n const path = []\n let parent\n while ((parent = el.parentNode)) {\n path.unshift(\n `${el.tagName}:nth-child(${([].indexOf as any).call(parent.children, el) + 1})`,\n )\n el = parent\n }\n return `${path.join(' > ')}`.toLowerCase()\n}\n\nlet ignoreScroll = false\n\n// NOTE: This function must remain pure and not use any outside variables\n// unless they are passed in as arguments. Why? Because we need to be able to\n// toString() it into a script tag to execute as early as possible in the browser\n// during SSR. Additionally, we also call it from within the router lifecycle\nexport function restoreScroll(\n storageKey: string,\n key?: string,\n behavior?: ScrollToOptions['behavior'],\n shouldScrollRestoration?: boolean,\n scrollToTopSelectors?: Array<string>,\n) {\n let byKey: ScrollRestorationByKey\n\n try {\n byKey = JSON.parse(sessionStorage.getItem(storageKey) || '{}')\n } catch (error: any) {\n console.error(error)\n return\n }\n\n const resolvedKey = key || window.history.state?.key\n const elementEntries = byKey[resolvedKey]\n\n //\n ignoreScroll = true\n\n //\n ;(() => {\n // If we have a cached entry for this location state,\n // we always need to prefer that over the hash scroll.\n if (shouldScrollRestoration && elementEntries) {\n for (const elementSelector in elementEntries) {\n const entry = elementEntries[elementSelector]!\n if (elementSelector === 'window') {\n window.scrollTo({\n top: entry.scrollY,\n left: entry.scrollX,\n behavior,\n })\n } else if (elementSelector) {\n const element = document.querySelector(elementSelector)\n if (element) {\n element.scrollLeft = entry.scrollX\n element.scrollTop = entry.scrollY\n }\n }\n }\n\n return\n }\n\n // If we don't have a cached entry for the hash,\n // Which means we've never seen this location before,\n // we need to check if there is a hash in the URL.\n // If there is, we need to scroll it's ID into view.\n const hash = window.location.hash.split('#')[1]\n\n if (hash) {\n const hashScrollIntoViewOptions =\n (window.history.state || {}).__hashScrollIntoViewOptions ?? true\n\n if (hashScrollIntoViewOptions) {\n const el = document.getElementById(hash)\n if (el) {\n el.scrollIntoView(hashScrollIntoViewOptions)\n }\n }\n\n return\n }\n\n // If there is no cached entry for the hash and there is no hash in the URL,\n // we need to scroll to the top of the page for every scrollToTop element\n ;[\n 'window',\n ...(scrollToTopSelectors?.filter((d) => d !== 'window') ?? []),\n ].forEach((selector) => {\n const element =\n selector === 'window' ? window : document.querySelector(selector)\n if (element) {\n element.scrollTo({\n top: 0,\n left: 0,\n behavior,\n })\n }\n })\n })()\n\n //\n ignoreScroll = false\n}\n\nexport function setupScrollRestoration(router: AnyRouter, force?: boolean) {\n const shouldScrollRestoration =\n force ?? router.options.scrollRestoration ?? false\n\n if (shouldScrollRestoration) {\n router.isScrollRestoring = true\n }\n\n if (typeof document === 'undefined' || router.isScrollRestorationSetup) {\n return\n }\n\n router.isScrollRestorationSetup = true\n\n //\n ignoreScroll = false\n\n const getKey =\n router.options.getScrollRestorationKey || defaultGetScrollRestorationKey\n\n window.history.scrollRestoration = 'manual'\n\n // // Create a MutationObserver to monitor DOM changes\n // const mutationObserver = new MutationObserver(() => {\n // ;ignoreScroll = true\n // requestAnimationFrame(() => {\n // ;ignoreScroll = false\n\n // // Attempt to restore scroll position on each dom\n // // mutation until the user scrolls. We do this\n // // because dynamic content may come in at different\n // // ticks after the initial render and we want to\n // // keep up with that content as much as possible.\n // // As soon as the user scrolls, we no longer need\n // // to attempt router.\n // // console.log('mutation observer restoreScroll')\n // restoreScroll(\n // storageKey,\n // getKey(router.state.location),\n // router.options.scrollRestorationBehavior,\n // )\n // })\n // })\n\n // const observeDom = () => {\n // // Observe changes to the entire document\n // mutationObserver.observe(document, {\n // childList: true, // Detect added or removed child nodes\n // subtree: true, // Monitor all descendants\n // characterData: true, // Detect text content changes\n // })\n // }\n\n // const unobserveDom = () => {\n // mutationObserver.disconnect()\n // }\n\n // observeDom()\n\n const onScroll = (event: Event) => {\n // unobserveDom()\n\n if (ignoreScroll || !router.isScrollRestoring) {\n return\n }\n\n let elementSelector = ''\n\n if (event.target === document || event.target === window) {\n elementSelector = 'window'\n } else {\n const attrId = (event.target as Element).getAttribute(\n 'data-scroll-restoration-id',\n )\n\n if (attrId) {\n elementSelector = `[data-scroll-restoration-id=\"${attrId}\"]`\n } else {\n elementSelector = getCssSelector(event.target)\n }\n }\n\n const restoreKey = getKey(router.state.location)\n\n scrollRestorationCache.set((state) => {\n const keyEntry = (state[restoreKey] =\n state[restoreKey] || ({} as ScrollRestorationByElement))\n\n const elementEntry = (keyEntry[elementSelector] =\n keyEntry[elementSelector] || ({} as ScrollRestorationEntry))\n\n if (elementSelector === 'window') {\n elementEntry.scrollX = window.scrollX || 0\n elementEntry.scrollY = window.scrollY || 0\n } else if (elementSelector) {\n const element = document.querySelector(elementSelector)\n if (element) {\n elementEntry.scrollX = element.scrollLeft || 0\n elementEntry.scrollY = element.scrollTop || 0\n }\n }\n\n return state\n })\n }\n\n // Throttle the scroll event to avoid excessive updates\n if (typeof document !== 'undefined') {\n document.addEventListener('scroll', throttle(onScroll, 100), true)\n }\n\n router.subscribe('onRendered', (event) => {\n // unobserveDom()\n\n const cacheKey = getKey(event.toLocation)\n\n // If the user doesn't want to restore the scroll position,\n // we don't need to do anything.\n if (!router.resetNextScroll) {\n router.resetNextScroll = true\n return\n }\n\n restoreScroll(\n storageKey,\n cacheKey,\n router.options.scrollRestorationBehavior,\n router.isScrollRestoring,\n router.options.scrollToTopSelectors,\n )\n\n if (router.isScrollRestoring) {\n // Mark the location as having been seen\n scrollRestorationCache.set((state) => {\n state[cacheKey] = state[cacheKey] || ({} as ScrollRestorationByElement)\n\n return state\n })\n }\n })\n}\n\nexport function ScrollRestoration() {\n const router = useRouter()\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 : null\n\n if (!router.isScrollRestoring || !router.isServer) {\n return null\n }\n\n return (\n <ScriptOnce\n children={`(${restoreScroll.toString()})(${JSON.stringify(storageKey)},${JSON.stringify(resolvedKey)}, undefined, true)`}\n log={false}\n />\n )\n}\n"],"names":["storageKey","sessionsStorage","window","sessionStorage","throttle","fn","wait","timeout","args","setTimeout","scrollRestorationCache","state","JSON","parse","getItem","set","updater","functionalUpdate","setItem","stringify","undefined","defaultGetScrollRestorationKey","location","key","href","getCssSelector","el","path","parent","parentNode","unshift","tagName","indexOf","call","children","join","toLowerCase","ignoreScroll","restoreScroll","behavior","shouldScrollRestoration","scrollToTopSelectors","byKey","error","console","resolvedKey","history","elementEntries","elementSelector","entry","scrollTo","top","scrollY","left","scrollX","element","document","querySelector","scrollLeft","scrollTop","hash","split","hashScrollIntoViewOptions","__hashScrollIntoViewOptions","getElementById","scrollIntoView","filter","d","forEach","selector","setupScrollRestoration","router","force","options","scrollRestoration","isScrollRestoring","isScrollRestorationSetup","getKey","getScrollRestorationKey","onScroll","event","target","attrId","getAttribute","restoreKey","keyEntry","elementEntry","addEventListener","subscribe","cacheKey","toLocation","resetNextScroll","scrollRestorationBehavior","ScrollRestoration","useRouter","userKey","latestLocation","isServer","_$createComponent","ScriptOnce","toString","log"],"mappings":"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"}
|
package/dist/source/Asset.jsx
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
import { Meta, Style, Title } from '@solidjs/meta';
|
|
1
2
|
export function Asset({ tag, attrs, children }) {
|
|
2
3
|
switch (tag) {
|
|
3
4
|
case 'title':
|
|
4
|
-
return <
|
|
5
|
+
return <Title {...attrs}>{children}</Title>;
|
|
5
6
|
case 'meta':
|
|
6
|
-
return <
|
|
7
|
+
return <Meta {...attrs}/>;
|
|
7
8
|
case 'link':
|
|
8
9
|
return <link {...attrs}/>;
|
|
9
10
|
case 'style':
|
|
10
|
-
return <
|
|
11
|
+
return <Style {...attrs} innerHTML={children}/>;
|
|
11
12
|
case 'script':
|
|
12
13
|
if (attrs && attrs.src) {
|
|
13
14
|
return <script {...attrs}/>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Asset.jsx","sourceRoot":"","sources":["../../src/Asset.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Asset.jsx","sourceRoot":"","sources":["../../src/Asset.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAGlD,MAAM,UAAU,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAoB;IAC9D,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAA;QAC7C,KAAK,MAAM;YACT,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAG,CAAA;QAC5B,KAAK,MAAM;YACT,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAG,CAAA;QAC5B,KAAK,OAAO;YACV,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,EAAG,CAAA;QAClD,KAAK,QAAQ;YACX,IAAK,KAAa,IAAK,KAAa,CAAC,GAAG,EAAE,CAAC;gBACzC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,EAAG,CAAA;YAC9B,CAAC;YACD,IAAI,OAAO,QAAQ,KAAK,QAAQ;gBAC9B,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,EAAG,CAAA;YACnD,OAAO,IAAI,CAAA;QACb;YACE,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as Solid from 'solid-js';
|
|
2
2
|
import type { RouterManagedTag } from '@tanstack/router-core';
|
|
3
|
-
export declare const useTags: () => RouterManagedTag[];
|
|
3
|
+
export declare const useTags: () => () => RouterManagedTag[];
|
|
4
4
|
/**
|
|
5
5
|
* @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.
|
|
6
6
|
* It should be rendered in the `<head>` of your document.
|
|
7
7
|
*/
|
|
8
|
-
export declare function HeadContent(): Solid.JSX.Element
|
|
8
|
+
export declare function HeadContent(): Solid.JSX.Element;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as Solid from 'solid-js';
|
|
2
|
+
import { MetaProvider } from '@solidjs/meta';
|
|
2
3
|
import { Asset } from './Asset';
|
|
3
4
|
import { useRouter } from './useRouter';
|
|
4
5
|
import { useRouterState } from './useRouterState';
|
|
@@ -50,7 +51,7 @@ export const useTags = () => {
|
|
|
50
51
|
}
|
|
51
52
|
resultMeta.reverse();
|
|
52
53
|
return resultMeta;
|
|
53
|
-
}
|
|
54
|
+
});
|
|
54
55
|
const links = useRouterState({
|
|
55
56
|
select: (state) => state.matches
|
|
56
57
|
.map((match) => match.links)
|
|
@@ -94,7 +95,7 @@ export const useTags = () => {
|
|
|
94
95
|
children,
|
|
95
96
|
})),
|
|
96
97
|
});
|
|
97
|
-
return uniqBy([
|
|
98
|
+
return () => uniqBy([
|
|
98
99
|
...meta(),
|
|
99
100
|
...preloadMeta(),
|
|
100
101
|
...links(),
|
|
@@ -109,7 +110,9 @@ export const useTags = () => {
|
|
|
109
110
|
*/
|
|
110
111
|
export function HeadContent() {
|
|
111
112
|
const tags = useTags();
|
|
112
|
-
return
|
|
113
|
+
return (<MetaProvider>
|
|
114
|
+
{tags().map((tag) => (<Asset {...tag}/>))}
|
|
115
|
+
</MetaProvider>);
|
|
113
116
|
}
|
|
114
117
|
function uniqBy(arr, fn) {
|
|
115
118
|
const seen = new Set();
|
|
@@ -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,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;IAE1B,MAAM,SAAS,GAAG,cAAc,CAAC;QAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAChB,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAClE,CAAC;KACF,CAAC,CAAA;IAEF,MAAM,IAAI,GAA4C,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE;QAC1E,MAAM,UAAU,GAA4B,EAAE,CAAA;QAC9C,MAAM,eAAe,GAAyB,EAAE,CAAA;QAChD,IAAI,KAAmC,CACtC;QAAA,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC5C,CAAC;YAAA,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBAClC,IAAI,CAAC,CAAC;oBAAE,OAAM;gBAEd,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;oBACZ,IAAI,CAAC,KAAK,EAAE,CAAC;wBACX,KAAK,GAAG;4BACN,GAAG,EAAE,OAAO;4BACZ,QAAQ,EAAE,CAAC,CAAC,KAAK;yBAClB,CAAA;oBACH,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAA;oBACtC,IAAI,SAAS,EAAE,CAAC;wBACd,IAAI,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;4BAC/B,OAAM;wBACR,CAAC;6BAAM,CAAC;4BACN,eAAe,CAAC,SAAS,CAAC,GAAG,IAAI,CAAA;wBACnC,CAAC;oBACH,CAAC;oBAED,UAAU,CAAC,IAAI,CAAC;wBACd,GAAG,EAAE,MAAM;wBACX,KAAK,EAAE;4BACL,GAAG,CAAC;yBACL;qBACF,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,IAAI,KAAK,EAAE,CAAC;YACV,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;QAED,UAAU,CAAC,OAAO,EAAE,CAAA;QAEpB,OAAO,UAAU,CAAA;IACnB,CAAC,
|
|
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;IAE1B,MAAM,SAAS,GAAG,cAAc,CAAC;QAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAChB,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAClE,CAAC;KACF,CAAC,CAAA;IAEF,MAAM,IAAI,GAA4C,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE;QAC1E,MAAM,UAAU,GAA4B,EAAE,CAAA;QAC9C,MAAM,eAAe,GAAyB,EAAE,CAAA;QAChD,IAAI,KAAmC,CACtC;QAAA,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC5C,CAAC;YAAA,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBAClC,IAAI,CAAC,CAAC;oBAAE,OAAM;gBAEd,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;oBACZ,IAAI,CAAC,KAAK,EAAE,CAAC;wBACX,KAAK,GAAG;4BACN,GAAG,EAAE,OAAO;4BACZ,QAAQ,EAAE,CAAC,CAAC,KAAK;yBAClB,CAAA;oBACH,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAA;oBACtC,IAAI,SAAS,EAAE,CAAC;wBACd,IAAI,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;4BAC/B,OAAM;wBACR,CAAC;6BAAM,CAAC;4BACN,eAAe,CAAC,SAAS,CAAC,GAAG,IAAI,CAAA;wBACnC,CAAC;oBACH,CAAC;oBAED,UAAU,CAAC,IAAI,CAAC;wBACd,GAAG,EAAE,MAAM;wBACX,KAAK,EAAE;4BACL,GAAG,CAAC;yBACL;qBACF,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,IAAI,KAAK,EAAE,CAAC;YACV,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;QAED,UAAU,CAAC,OAAO,EAAE,CAAA;QAEpB,OAAO,UAAU,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,cAAc,CAAC;QAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAChB,KAAK,CAAC,OAAO;aACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAM,CAAC;aAC5B,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,CAAC,CAAC;aACP,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACd,GAAG,EAAE,MAAM;YACX,KAAK,EAAE;gBACL,GAAG,IAAI;aACR;SACF,CAAC,CAA4B;KACnC,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,cAAc,CAAC;QACjC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAChB,MAAM,WAAW,GAA4B,EAAE,CAAA;YAE/C,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,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,QAAQ;gBAC9C,EAAE,MAAM,CAAC,OAAO,CAAC;iBAChB,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBACnB,WAAW,CAAC,IAAI,CAAC;oBACf,GAAG,EAAE,MAAM;oBACX,KAAK,EAAE;wBACL,GAAG,EAAE,eAAe;wBACpB,IAAI,EAAE,OAAO;qBACd;iBACF,CAAC,CAAA;YACJ,CAAC,CAAC,CACL,CAAA;YAEH,OAAO,WAAW,CAAA;QACpB,CAAC;KACF,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,cAAc,CAAC;QACjC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAEd,KAAK,CAAC,OAAO;aACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAY,CAAC;aAClC,IAAI,CAAC,CAAC,CAAC;aACP,MAAM,CAAC,OAAO,CAClB,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YAClC,GAAG,EAAE,QAAQ;YACb,KAAK,EAAE;gBACL,GAAG,MAAM;aACV;YACD,QAAQ;SACT,CAAC,CAAC;KACN,CAAC,CAAA;IAEF,OAAO,GAAG,EAAE,CACV,MAAM,CACJ;QACE,GAAG,IAAI,EAAE;QACT,GAAG,WAAW,EAAE;QAChB,GAAG,KAAK,EAAE;QACV,GAAG,WAAW,EAAE;KACU,EAC5B,CAAC,CAAC,EAAE,EAAE;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAC1B,CAAC,CACF,CAAA;AACL,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;IACtB,OAAO,CACL,CAAC,YAAY,CACX;MAAA,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACnB,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAG,CACnB,CAAC,CACJ;IAAA,EAAE,YAAY,CAAC,CAChB,CAAA;AACH,CAAC;AAED,SAAS,MAAM,CAAI,GAAa,EAAE,EAAuB;IACvD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QACpB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
package/dist/source/index.d.ts
CHANGED
|
@@ -46,5 +46,5 @@ export type { NotFoundError } from './not-found';
|
|
|
46
46
|
export * from './typePrimitives';
|
|
47
47
|
export { ScriptOnce } from './ScriptOnce';
|
|
48
48
|
export { Asset } from './Asset';
|
|
49
|
-
export { HeadContent } from './HeadContent';
|
|
49
|
+
export { HeadContent, useTags } from './HeadContent';
|
|
50
50
|
export { Scripts } from './Scripts';
|
package/dist/source/index.jsx
CHANGED
|
@@ -36,6 +36,6 @@ export { notFound, isNotFound, CatchNotFound, DefaultGlobalNotFound, } from './n
|
|
|
36
36
|
export * from './typePrimitives';
|
|
37
37
|
export { ScriptOnce } from './ScriptOnce';
|
|
38
38
|
export { Asset } from './Asset';
|
|
39
|
-
export { HeadContent } from './HeadContent';
|
|
39
|
+
export { HeadContent, useTags } from './HeadContent';
|
|
40
40
|
export { Scripts } from './Scripts';
|
|
41
41
|
//# sourceMappingURL=index.jsx.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,12 @@ import { functionalUpdate } from '@tanstack/router-core';
|
|
|
2
2
|
import { useRouter } from './useRouter';
|
|
3
3
|
import { ScriptOnce } from './ScriptOnce';
|
|
4
4
|
export const storageKey = 'tsr-scroll-restoration-v1_3';
|
|
5
|
-
|
|
5
|
+
let sessionsStorage = false;
|
|
6
|
+
try {
|
|
7
|
+
sessionsStorage =
|
|
8
|
+
typeof window !== 'undefined' && typeof window.sessionStorage === 'object';
|
|
9
|
+
}
|
|
10
|
+
catch { }
|
|
6
11
|
const throttle = (fn, wait) => {
|
|
7
12
|
let timeout;
|
|
8
13
|
return (...args) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-restoration.jsx","sourceRoot":"","sources":["../../src/scroll-restoration.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAmBzC,MAAM,CAAC,MAAM,UAAU,GAAG,6BAA6B,CAAA;AACvD,
|
|
1
|
+
{"version":3,"file":"scroll-restoration.jsx","sourceRoot":"","sources":["../../src/scroll-restoration.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/solid-router",
|
|
3
|
-
"version": "1.112.
|
|
3
|
+
"version": "1.112.7",
|
|
4
4
|
"description": "Modern and scalable routing for Solid applications",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -55,12 +55,13 @@
|
|
|
55
55
|
"dependencies": {
|
|
56
56
|
"@solid-devtools/logger": "^0.9.4",
|
|
57
57
|
"@solid-primitives/refs": "^1.0.8",
|
|
58
|
+
"@solidjs/meta": "^0.29.4",
|
|
58
59
|
"@tanstack/solid-store": "^0.7.0",
|
|
59
60
|
"jsesc": "^3.0.2",
|
|
60
61
|
"tiny-invariant": "^1.3.3",
|
|
61
62
|
"tiny-warning": "^1.0.3",
|
|
62
|
-
"@tanstack/
|
|
63
|
-
"@tanstack/
|
|
63
|
+
"@tanstack/router-core": "1.112.0",
|
|
64
|
+
"@tanstack/history": "1.99.13"
|
|
64
65
|
},
|
|
65
66
|
"devDependencies": {
|
|
66
67
|
"@solidjs/testing-library": "^0.8.10",
|
|
@@ -68,12 +69,12 @@
|
|
|
68
69
|
"@types/jsesc": "^3.0.3",
|
|
69
70
|
"combinate": "^1.1.11",
|
|
70
71
|
"eslint-plugin-solid": "^0.14.5",
|
|
71
|
-
"solid-js": "^1",
|
|
72
|
+
"solid-js": "^1.9.5",
|
|
72
73
|
"vite-plugin-solid": "^2.11.2",
|
|
73
74
|
"zod": "^3.23.8"
|
|
74
75
|
},
|
|
75
76
|
"peerDependencies": {
|
|
76
|
-
"solid-js": "^1"
|
|
77
|
+
"solid-js": "^1.9.5"
|
|
77
78
|
},
|
|
78
79
|
"scripts": {}
|
|
79
80
|
}
|
package/src/Asset.tsx
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
|
+
import { Meta, Style, Title } from '@solidjs/meta'
|
|
1
2
|
import type { RouterManagedTag } from '@tanstack/router-core'
|
|
2
3
|
|
|
3
4
|
export function Asset({ tag, attrs, children }: RouterManagedTag): any {
|
|
4
5
|
switch (tag) {
|
|
5
6
|
case 'title':
|
|
6
|
-
return <
|
|
7
|
+
return <Title {...attrs}>{children}</Title>
|
|
7
8
|
case 'meta':
|
|
8
|
-
return <
|
|
9
|
+
return <Meta {...attrs} />
|
|
9
10
|
case 'link':
|
|
10
11
|
return <link {...attrs} />
|
|
11
12
|
case 'style':
|
|
12
|
-
return <
|
|
13
|
+
return <Style {...attrs} innerHTML={children} />
|
|
13
14
|
case 'script':
|
|
14
15
|
if ((attrs as any) && (attrs as any).src) {
|
|
15
16
|
return <script {...attrs} />
|
package/src/HeadContent.tsx
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as Solid from 'solid-js'
|
|
2
|
+
import { MetaProvider } from '@solidjs/meta'
|
|
2
3
|
import { Asset } from './Asset'
|
|
3
4
|
import { useRouter } from './useRouter'
|
|
4
5
|
import { useRouterState } from './useRouterState'
|
|
@@ -55,7 +56,7 @@ export const useTags = () => {
|
|
|
55
56
|
resultMeta.reverse()
|
|
56
57
|
|
|
57
58
|
return resultMeta
|
|
58
|
-
}
|
|
59
|
+
})
|
|
59
60
|
|
|
60
61
|
const links = useRouterState({
|
|
61
62
|
select: (state) =>
|
|
@@ -111,17 +112,18 @@ export const useTags = () => {
|
|
|
111
112
|
})),
|
|
112
113
|
})
|
|
113
114
|
|
|
114
|
-
return
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
115
|
+
return () =>
|
|
116
|
+
uniqBy(
|
|
117
|
+
[
|
|
118
|
+
...meta(),
|
|
119
|
+
...preloadMeta(),
|
|
120
|
+
...links(),
|
|
121
|
+
...headScripts(),
|
|
122
|
+
] as Array<RouterManagedTag>,
|
|
123
|
+
(d) => {
|
|
124
|
+
return JSON.stringify(d)
|
|
125
|
+
},
|
|
126
|
+
)
|
|
125
127
|
}
|
|
126
128
|
|
|
127
129
|
/**
|
|
@@ -130,7 +132,13 @@ export const useTags = () => {
|
|
|
130
132
|
*/
|
|
131
133
|
export function HeadContent() {
|
|
132
134
|
const tags = useTags()
|
|
133
|
-
return
|
|
135
|
+
return (
|
|
136
|
+
<MetaProvider>
|
|
137
|
+
{tags().map((tag) => (
|
|
138
|
+
<Asset {...tag} />
|
|
139
|
+
))}
|
|
140
|
+
</MetaProvider>
|
|
141
|
+
)
|
|
134
142
|
}
|
|
135
143
|
|
|
136
144
|
function uniqBy<T>(arr: Array<T>, fn: (item: T) => string) {
|
package/src/index.tsx
CHANGED
|
@@ -350,5 +350,5 @@ export * from './typePrimitives'
|
|
|
350
350
|
export { ScriptOnce } from './ScriptOnce'
|
|
351
351
|
|
|
352
352
|
export { Asset } from './Asset'
|
|
353
|
-
export { HeadContent } from './HeadContent'
|
|
353
|
+
export { HeadContent, useTags } from './HeadContent'
|
|
354
354
|
export { Scripts } from './Scripts'
|
|
@@ -20,7 +20,11 @@ export type ScrollRestorationOptions = {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
export const storageKey = 'tsr-scroll-restoration-v1_3'
|
|
23
|
-
|
|
23
|
+
let sessionsStorage = false
|
|
24
|
+
try {
|
|
25
|
+
sessionsStorage =
|
|
26
|
+
typeof window !== 'undefined' && typeof window.sessionStorage === 'object'
|
|
27
|
+
} catch {}
|
|
24
28
|
const throttle = (fn: (...args: Array<any>) => void, wait: number) => {
|
|
25
29
|
let timeout: any
|
|
26
30
|
return (...args: Array<any>) => {
|