@tanstack/solid-router 1.166.7 → 2.0.0-alpha.1
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 +111 -68
- package/dist/cjs/Asset.cjs.map +1 -1
- package/dist/cjs/CatchBoundary.cjs +15 -15
- package/dist/cjs/CatchBoundary.cjs.map +1 -1
- package/dist/cjs/ClientOnly.cjs +2 -2
- package/dist/cjs/ClientOnly.cjs.map +1 -1
- package/dist/cjs/HeadContent.cjs +16 -8
- package/dist/cjs/HeadContent.cjs.map +1 -1
- package/dist/cjs/HeadContent.dev.cjs +18 -10
- package/dist/cjs/HeadContent.dev.cjs.map +1 -1
- package/dist/cjs/Match.cjs +125 -81
- package/dist/cjs/Match.cjs.map +1 -1
- package/dist/cjs/Matches.cjs +23 -16
- package/dist/cjs/Matches.cjs.map +1 -1
- package/dist/cjs/RouterProvider.cjs +3 -2
- package/dist/cjs/RouterProvider.cjs.map +1 -1
- package/dist/cjs/SafeFragment.cjs +1 -1
- package/dist/cjs/ScriptOnce.cjs +4 -2
- package/dist/cjs/ScriptOnce.cjs.map +1 -1
- package/dist/cjs/Scripts.cjs +6 -2
- package/dist/cjs/Scripts.cjs.map +1 -1
- package/dist/cjs/Transitioner.cjs +11 -16
- package/dist/cjs/Transitioner.cjs.map +1 -1
- package/dist/cjs/awaited.cjs +20 -16
- package/dist/cjs/awaited.cjs.map +1 -1
- package/dist/cjs/lazyRouteComponent.cjs +3 -3
- package/dist/cjs/lazyRouteComponent.cjs.map +1 -1
- package/dist/cjs/link.cjs +40 -22
- package/dist/cjs/link.cjs.map +1 -1
- package/dist/cjs/not-found.cjs +1 -1
- package/dist/cjs/renderRouteNotFound.cjs +1 -1
- package/dist/cjs/route.cjs +1 -1
- package/dist/cjs/scroll-restoration.cjs +1 -1
- package/dist/cjs/ssr/RouterClient.cjs +4 -23
- package/dist/cjs/ssr/RouterClient.cjs.map +1 -1
- package/dist/cjs/ssr/RouterServer.cjs +4 -47
- package/dist/cjs/ssr/RouterServer.cjs.map +1 -1
- package/dist/cjs/ssr/RouterServer.d.cts +0 -1
- package/dist/cjs/ssr/defaultRenderHandler.cjs +1 -1
- package/dist/cjs/ssr/defaultStreamHandler.cjs +1 -1
- package/dist/cjs/ssr/renderRouterToStream.cjs +2 -3
- package/dist/cjs/ssr/renderRouterToStream.cjs.map +1 -1
- package/dist/cjs/ssr/renderRouterToString.cjs +2 -2
- package/dist/cjs/ssr/renderRouterToString.cjs.map +1 -1
- package/dist/cjs/ssr/renderRouterToString.d.cts +1 -1
- package/dist/cjs/useBlocker.cjs +9 -5
- package/dist/cjs/useBlocker.cjs.map +1 -1
- package/dist/cjs/useMatch.cjs +3 -6
- package/dist/cjs/useMatch.cjs.map +1 -1
- package/dist/cjs/useNavigate.cjs +1 -1
- package/dist/cjs/useNavigate.cjs.map +1 -1
- package/dist/cjs/useRouterState.cjs +15 -9
- package/dist/cjs/useRouterState.cjs.map +1 -1
- package/dist/cjs/utils.cjs +2 -4
- package/dist/cjs/utils.cjs.map +1 -1
- package/dist/cjs/utils.d.cts +1 -0
- package/dist/esm/Asset.js +111 -68
- package/dist/esm/Asset.js.map +1 -1
- package/dist/esm/CatchBoundary.js +15 -15
- package/dist/esm/CatchBoundary.js.map +1 -1
- package/dist/esm/ClientOnly.js +2 -2
- package/dist/esm/ClientOnly.js.map +1 -1
- package/dist/esm/HeadContent.dev.js +18 -10
- package/dist/esm/HeadContent.dev.js.map +1 -1
- package/dist/esm/HeadContent.js +16 -8
- package/dist/esm/HeadContent.js.map +1 -1
- package/dist/esm/Match.js +89 -45
- package/dist/esm/Match.js.map +1 -1
- package/dist/esm/Matches.js +23 -16
- package/dist/esm/Matches.js.map +1 -1
- package/dist/esm/RouterProvider.js +3 -2
- package/dist/esm/RouterProvider.js.map +1 -1
- package/dist/esm/SafeFragment.js +1 -1
- package/dist/esm/ScriptOnce.js +4 -2
- package/dist/esm/ScriptOnce.js.map +1 -1
- package/dist/esm/Scripts.js +6 -2
- package/dist/esm/Scripts.js.map +1 -1
- package/dist/esm/Transitioner.js +11 -16
- package/dist/esm/Transitioner.js.map +1 -1
- package/dist/esm/awaited.js +18 -14
- package/dist/esm/awaited.js.map +1 -1
- package/dist/esm/lazyRouteComponent.js +3 -3
- package/dist/esm/lazyRouteComponent.js.map +1 -1
- package/dist/esm/link.js +39 -21
- package/dist/esm/link.js.map +1 -1
- package/dist/esm/not-found.js +1 -1
- package/dist/esm/renderRouteNotFound.js +1 -1
- package/dist/esm/route.js +1 -1
- package/dist/esm/scroll-restoration.js +1 -1
- package/dist/esm/ssr/RouterClient.js +4 -23
- package/dist/esm/ssr/RouterClient.js.map +1 -1
- package/dist/esm/ssr/RouterServer.d.ts +0 -1
- package/dist/esm/ssr/RouterServer.js +5 -48
- package/dist/esm/ssr/RouterServer.js.map +1 -1
- package/dist/esm/ssr/defaultRenderHandler.js +1 -1
- package/dist/esm/ssr/defaultStreamHandler.js +1 -1
- package/dist/esm/ssr/renderRouterToStream.js +2 -4
- package/dist/esm/ssr/renderRouterToStream.js.map +1 -1
- package/dist/esm/ssr/renderRouterToString.d.ts +1 -1
- package/dist/esm/ssr/renderRouterToString.js +2 -2
- package/dist/esm/ssr/renderRouterToString.js.map +1 -1
- package/dist/esm/useBlocker.js +9 -5
- package/dist/esm/useBlocker.js.map +1 -1
- package/dist/esm/useMatch.js +3 -6
- package/dist/esm/useMatch.js.map +1 -1
- package/dist/esm/useNavigate.js +1 -1
- package/dist/esm/useNavigate.js.map +1 -1
- package/dist/esm/useRouterState.js +15 -9
- package/dist/esm/useRouterState.js.map +1 -1
- package/dist/esm/utils.d.ts +1 -0
- package/dist/esm/utils.js +2 -4
- package/dist/esm/utils.js.map +1 -1
- package/dist/source/Asset.jsx +58 -35
- package/dist/source/Asset.jsx.map +1 -1
- package/dist/source/CatchBoundary.jsx +9 -5
- package/dist/source/CatchBoundary.jsx.map +1 -1
- package/dist/source/ClientOnly.jsx +1 -1
- package/dist/source/ClientOnly.jsx.map +1 -1
- package/dist/source/HeadContent.dev.jsx +8 -6
- package/dist/source/HeadContent.dev.jsx.map +1 -1
- package/dist/source/HeadContent.jsx +6 -4
- package/dist/source/HeadContent.jsx.map +1 -1
- package/dist/source/Match.jsx +76 -35
- package/dist/source/Match.jsx.map +1 -1
- package/dist/source/Matches.jsx +25 -17
- package/dist/source/Matches.jsx.map +1 -1
- package/dist/source/RouterProvider.jsx +2 -3
- package/dist/source/RouterProvider.jsx.map +1 -1
- package/dist/source/Scripts.jsx +4 -3
- package/dist/source/Scripts.jsx.map +1 -1
- package/dist/source/Transitioner.jsx +15 -16
- package/dist/source/Transitioner.jsx.map +1 -1
- package/dist/source/awaited.jsx +7 -8
- package/dist/source/awaited.jsx.map +1 -1
- package/dist/source/lazyRouteComponent.jsx +3 -3
- package/dist/source/lazyRouteComponent.jsx.map +1 -1
- package/dist/source/link.jsx +53 -48
- package/dist/source/link.jsx.map +1 -1
- package/dist/source/ssr/RouterClient.jsx +1 -13
- package/dist/source/ssr/RouterClient.jsx.map +1 -1
- package/dist/source/ssr/RouterServer.d.ts +0 -1
- package/dist/source/ssr/RouterServer.jsx +1 -34
- package/dist/source/ssr/RouterServer.jsx.map +1 -1
- package/dist/source/ssr/renderRouterToStream.jsx +2 -6
- package/dist/source/ssr/renderRouterToStream.jsx.map +1 -1
- package/dist/source/ssr/renderRouterToString.d.ts +1 -1
- package/dist/source/ssr/renderRouterToString.jsx +2 -2
- package/dist/source/ssr/renderRouterToString.jsx.map +1 -1
- package/dist/source/useBlocker.jsx +8 -4
- package/dist/source/useBlocker.jsx.map +1 -1
- package/dist/source/useMatch.jsx +3 -8
- package/dist/source/useMatch.jsx.map +1 -1
- package/dist/source/useNavigate.jsx +1 -1
- package/dist/source/useNavigate.jsx.map +1 -1
- package/dist/source/useRouterState.jsx +23 -10
- package/dist/source/useRouterState.jsx.map +1 -1
- package/dist/source/utils.d.ts +1 -0
- package/dist/source/utils.js +3 -4
- package/dist/source/utils.js.map +1 -1
- package/package.json +7 -6
- package/src/Asset.tsx +123 -95
- package/src/CatchBoundary.tsx +9 -7
- package/src/ClientOnly.tsx +8 -3
- package/src/HeadContent.dev.tsx +16 -11
- package/src/HeadContent.tsx +6 -4
- package/src/Match.tsx +112 -44
- package/src/Matches.tsx +39 -30
- package/src/RouterProvider.tsx +7 -4
- package/src/Scripts.tsx +4 -3
- package/src/Transitioner.tsx +51 -58
- package/src/awaited.tsx +11 -12
- package/src/lazyRouteComponent.tsx +3 -3
- package/src/link.tsx +68 -60
- package/src/ssr/RouterClient.tsx +1 -22
- package/src/ssr/RouterServer.tsx +1 -53
- package/src/ssr/renderRouterToStream.tsx +5 -15
- package/src/ssr/renderRouterToString.tsx +2 -2
- package/src/useBlocker.tsx +8 -4
- package/src/useMatch.tsx +6 -11
- package/src/useNavigate.tsx +1 -1
- package/src/useRouterState.tsx +34 -22
- package/src/utils.ts +5 -4
package/dist/source/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,UAAU,CAAA;AAEjC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAiB,EAAE,EAAE;IAC/C,OAAO,KAAK,CAAC,UAAU,CACrB,CACE,OAA8D;QAC5D,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;KACf,EACD,EAAE;QACF,MAAM,OAAO,GAAG,EAAE,EAAE,CAAA;QAEpB,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC7B,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,UAAU,CAAA;AAEjC,MAAM,CAAC,MAAM,eAAe,GAC1B,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAA;AAEzE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAiB,EAAE,EAAE;IAC/C,OAAO,KAAK,CAAC,UAAU,CACrB,CACE,OAA8D;QAC5D,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;KACf,EACD,EAAE;QACF,MAAM,OAAO,GAAG,EAAE,EAAE,CAAA;QAEpB,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC7B,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAA;QAC5C,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC,CACF,CAAA;AACH,CAAC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,uBAAuB,CACrC,GAA6B,EAC7B,QAAgE,EAChE,8BAAwD,EAAE,EAC1D,UAAkC,EAAE;IAEpC,MAAM,+BAA+B,GACnC,OAAO,oBAAoB,KAAK,UAAU,CAAA;IAC5C,IAAI,WAAW,GAAgC,IAAI,CAAA;IAEnD,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;QAC5B,IAAI,CAAC,CAAC,IAAI,CAAC,+BAA+B,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC/D,OAAM;QACR,CAAC;QAED,WAAW,GAAG,IAAI,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE;YACjD,QAAQ,CAAC,KAAK,CAAC,CAAA;QACjB,CAAC,EAAE,2BAA2B,CAAC,CAAA;QAE/B,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QAEtB,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;YACnB,WAAW,EAAE,UAAU,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,OAAO,GAAG,EAAE,CAAC,WAAW,CAAA;AAC1B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/solid-router",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-alpha.1",
|
|
4
4
|
"description": "Modern and scalable routing for Solid applications",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -85,9 +85,8 @@
|
|
|
85
85
|
},
|
|
86
86
|
"dependencies": {
|
|
87
87
|
"@solid-devtools/logger": "^0.9.4",
|
|
88
|
-
"@solid-primitives/refs": "^1.0.8",
|
|
89
88
|
"@solidjs/meta": "^0.29.4",
|
|
90
|
-
"@
|
|
89
|
+
"@solidjs/web": "2.0.0-beta.2",
|
|
91
90
|
"isbot": "^5.1.22",
|
|
92
91
|
"tiny-invariant": "^1.3.3",
|
|
93
92
|
"tiny-warning": "^1.0.3",
|
|
@@ -99,13 +98,15 @@
|
|
|
99
98
|
"@testing-library/jest-dom": "^6.6.3",
|
|
100
99
|
"combinate": "^1.1.11",
|
|
101
100
|
"eslint-plugin-solid": "^0.14.5",
|
|
102
|
-
"solid-js": "
|
|
101
|
+
"solid-js": "2.0.0-beta.2",
|
|
102
|
+
"@solidjs/web": "2.0.0-beta.2",
|
|
103
103
|
"vite": "*",
|
|
104
|
-
"vite-plugin-solid": "
|
|
104
|
+
"vite-plugin-solid": "3.0.0-next.2",
|
|
105
105
|
"zod": "^3.23.8"
|
|
106
106
|
},
|
|
107
107
|
"peerDependencies": {
|
|
108
|
-
"solid-js": "
|
|
108
|
+
"solid-js": "2.0.0-beta.2",
|
|
109
|
+
"@solidjs/web": "2.0.0-beta.2"
|
|
109
110
|
},
|
|
110
111
|
"scripts": {
|
|
111
112
|
"clean": "rimraf ./dist && rimraf ./coverage",
|
package/src/Asset.tsx
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { Link, Meta, Style, Title } from '@solidjs/meta'
|
|
2
|
-
import { onCleanup, onMount } from 'solid-js'
|
|
3
1
|
import { isServer } from '@tanstack/router-core/isServer'
|
|
2
|
+
import { createEffect, onCleanup } from 'solid-js'
|
|
4
3
|
import { useRouter } from './useRouter'
|
|
5
4
|
import type { RouterManagedTag } from '@tanstack/router-core'
|
|
6
5
|
import type { JSX } from 'solid-js'
|
|
@@ -12,105 +11,114 @@ export function Asset({
|
|
|
12
11
|
}: RouterManagedTag): JSX.Element | null {
|
|
13
12
|
switch (tag) {
|
|
14
13
|
case 'title':
|
|
15
|
-
return <Title {
|
|
14
|
+
return <Title attrs={attrs} children={children} />
|
|
16
15
|
case 'meta':
|
|
17
|
-
return <
|
|
16
|
+
return <meta {...attrs} />
|
|
18
17
|
case 'link':
|
|
19
|
-
return <
|
|
18
|
+
return <link {...attrs} />
|
|
20
19
|
case 'style':
|
|
21
|
-
|
|
20
|
+
if (typeof children === 'string') {
|
|
21
|
+
return <style {...attrs} innerHTML={children} />
|
|
22
|
+
}
|
|
23
|
+
return <style {...attrs} />
|
|
22
24
|
case 'script':
|
|
23
|
-
return <Script attrs={attrs}
|
|
25
|
+
return <Script attrs={attrs} children={children} />
|
|
24
26
|
default:
|
|
25
27
|
return null
|
|
26
28
|
}
|
|
27
29
|
}
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
function Title(props: {
|
|
32
|
+
attrs?: Record<string, any>
|
|
33
|
+
children?: unknown
|
|
34
|
+
}): JSX.Element | null {
|
|
35
|
+
const router = useRouter()
|
|
36
|
+
const attrs = props.attrs
|
|
37
|
+
const children = props.children
|
|
38
|
+
|
|
39
|
+
// Server: render <title> normally
|
|
40
|
+
if (isServer ?? router.isServer) {
|
|
41
|
+
return <title {...attrs}>{children as string}</title>
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Client: imperatively set document.title so it updates during
|
|
45
|
+
// client-side navigation (JSX <title> in <head> doesn't reliably
|
|
46
|
+
// update the browser's document.title).
|
|
47
|
+
createEffect(
|
|
48
|
+
() => children,
|
|
49
|
+
(titleText) => {
|
|
50
|
+
document.title = typeof titleText === 'string' ? titleText : ''
|
|
51
|
+
},
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
// Still render the <title> element in the DOM for consistency,
|
|
55
|
+
// but the imperative assignment above is what actually drives the update.
|
|
56
|
+
return <title {...attrs}>{children as string}</title>
|
|
32
57
|
}
|
|
33
58
|
|
|
34
|
-
function Script({
|
|
35
|
-
attrs,
|
|
36
|
-
children
|
|
37
|
-
}: {
|
|
38
|
-
attrs?: ScriptAttrs
|
|
39
|
-
children?: string
|
|
59
|
+
function Script(props: {
|
|
60
|
+
attrs?: Record<string, any>
|
|
61
|
+
children?: unknown
|
|
40
62
|
}): JSX.Element | null {
|
|
41
63
|
const router = useRouter()
|
|
64
|
+
const attrs = props.attrs
|
|
65
|
+
const children = props.children
|
|
66
|
+
|
|
42
67
|
const dataScript =
|
|
43
68
|
typeof attrs?.type === 'string' &&
|
|
44
69
|
attrs.type !== '' &&
|
|
45
70
|
attrs.type !== 'text/javascript' &&
|
|
46
71
|
attrs.type !== 'module'
|
|
47
72
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
73
|
+
// --- Server rendering ---
|
|
74
|
+
if (isServer ?? router.isServer) {
|
|
51
75
|
if (attrs?.src) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const base = document.baseURI || window.location.href
|
|
55
|
-
return new URL(attrs.src, base).href
|
|
56
|
-
} catch {
|
|
57
|
-
return attrs.src
|
|
58
|
-
}
|
|
59
|
-
})()
|
|
60
|
-
const existingScript = Array.from(
|
|
61
|
-
document.querySelectorAll('script[src]'),
|
|
62
|
-
).find((el) => (el as HTMLScriptElement).src === normSrc)
|
|
63
|
-
|
|
64
|
-
if (existingScript) {
|
|
65
|
-
return
|
|
66
|
-
}
|
|
76
|
+
return <script {...attrs} />
|
|
77
|
+
}
|
|
67
78
|
|
|
68
|
-
|
|
79
|
+
if (typeof children === 'string') {
|
|
80
|
+
return <script {...attrs} innerHTML={children} />
|
|
81
|
+
}
|
|
69
82
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
script.setAttribute(
|
|
73
|
-
key,
|
|
74
|
-
typeof value === 'boolean' ? '' : String(value),
|
|
75
|
-
)
|
|
76
|
-
}
|
|
77
|
-
}
|
|
83
|
+
return null
|
|
84
|
+
}
|
|
78
85
|
|
|
79
|
-
|
|
86
|
+
// --- Client rendering ---
|
|
80
87
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
88
|
+
// Data scripts (e.g. application/ld+json) are rendered in the tree;
|
|
89
|
+
// they don't need to execute.
|
|
90
|
+
if (dataScript && typeof children === 'string') {
|
|
91
|
+
return <script {...attrs} innerHTML={children} />
|
|
92
|
+
}
|
|
87
93
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
94
|
+
// For executable scripts, use imperative DOM injection so the browser
|
|
95
|
+
// actually executes them during client-side navigation.
|
|
96
|
+
createEffect(
|
|
97
|
+
() => ({ attrs, children, dataScript }) as const,
|
|
98
|
+
({ attrs, children, dataScript }) => {
|
|
99
|
+
if (dataScript) return
|
|
100
|
+
|
|
101
|
+
let script: HTMLScriptElement | undefined
|
|
102
|
+
|
|
103
|
+
if (attrs?.src) {
|
|
104
|
+
const normSrc = (() => {
|
|
105
|
+
try {
|
|
106
|
+
const base = document.baseURI || window.location.href
|
|
107
|
+
return new URL(attrs.src, base).href
|
|
108
|
+
} catch {
|
|
109
|
+
return attrs.src
|
|
110
|
+
}
|
|
111
|
+
})()
|
|
112
|
+
const existingScript = Array.from(
|
|
113
|
+
document.querySelectorAll('script[src]'),
|
|
114
|
+
).find((el) => (el as HTMLScriptElement).src === normSrc)
|
|
105
115
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
116
|
+
if (existingScript) {
|
|
117
|
+
return
|
|
118
|
+
}
|
|
109
119
|
|
|
110
|
-
|
|
111
|
-
script.textContent = children
|
|
120
|
+
script = document.createElement('script')
|
|
112
121
|
|
|
113
|
-
if (attrs) {
|
|
114
122
|
for (const [key, value] of Object.entries(attrs)) {
|
|
115
123
|
if (value !== undefined && value !== false) {
|
|
116
124
|
script.setAttribute(
|
|
@@ -119,34 +127,54 @@ function Script({
|
|
|
119
127
|
)
|
|
120
128
|
}
|
|
121
129
|
}
|
|
122
|
-
}
|
|
123
130
|
|
|
124
|
-
|
|
131
|
+
document.head.appendChild(script)
|
|
132
|
+
} else if (typeof children === 'string') {
|
|
133
|
+
const typeAttr =
|
|
134
|
+
typeof attrs?.type === 'string' ? attrs.type : 'text/javascript'
|
|
135
|
+
const nonceAttr =
|
|
136
|
+
typeof attrs?.nonce === 'string' ? attrs.nonce : undefined
|
|
137
|
+
const existingScript = Array.from(
|
|
138
|
+
document.querySelectorAll('script:not([src])'),
|
|
139
|
+
).find((el) => {
|
|
140
|
+
if (!(el instanceof HTMLScriptElement)) return false
|
|
141
|
+
const sType = el.getAttribute('type') ?? 'text/javascript'
|
|
142
|
+
const sNonce = el.getAttribute('nonce') ?? undefined
|
|
143
|
+
return (
|
|
144
|
+
el.textContent === children &&
|
|
145
|
+
sType === typeAttr &&
|
|
146
|
+
sNonce === nonceAttr
|
|
147
|
+
)
|
|
148
|
+
})
|
|
125
149
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
script.parentNode.removeChild(script)
|
|
150
|
+
if (existingScript) {
|
|
151
|
+
return
|
|
129
152
|
}
|
|
130
|
-
})
|
|
131
|
-
}
|
|
132
|
-
})
|
|
133
153
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
154
|
+
script = document.createElement('script')
|
|
155
|
+
script.textContent = children
|
|
156
|
+
|
|
157
|
+
if (attrs) {
|
|
158
|
+
for (const [key, value] of Object.entries(attrs)) {
|
|
159
|
+
if (value !== undefined && value !== false) {
|
|
160
|
+
script.setAttribute(
|
|
161
|
+
key,
|
|
162
|
+
typeof value === 'boolean' ? '' : String(value),
|
|
163
|
+
)
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
142
167
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
}
|
|
168
|
+
document.head.appendChild(script)
|
|
169
|
+
}
|
|
146
170
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
171
|
+
onCleanup(() => {
|
|
172
|
+
if (script?.parentNode) {
|
|
173
|
+
script.parentNode.removeChild(script)
|
|
174
|
+
}
|
|
175
|
+
})
|
|
176
|
+
},
|
|
177
|
+
)
|
|
150
178
|
|
|
151
179
|
return null
|
|
152
180
|
}
|
package/src/CatchBoundary.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as Solid from 'solid-js'
|
|
2
|
-
import { Dynamic } from '
|
|
2
|
+
import { Dynamic } from '@solidjs/web'
|
|
3
3
|
import type { ErrorRouteComponent } from './route'
|
|
4
4
|
|
|
5
5
|
export function CatchBoundary(
|
|
@@ -11,13 +11,15 @@ export function CatchBoundary(
|
|
|
11
11
|
} & Solid.ParentProps,
|
|
12
12
|
) {
|
|
13
13
|
return (
|
|
14
|
-
<Solid.
|
|
14
|
+
<Solid.Errored
|
|
15
15
|
fallback={(error, reset) => {
|
|
16
16
|
props.onCatch?.(error)
|
|
17
17
|
|
|
18
|
-
Solid.createEffect(
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
Solid.createEffect(props.getResetKey, () => {
|
|
19
|
+
// We trigger reset here. For a fully deferred effect we might need usePrevious,
|
|
20
|
+
// but calling reset on key change is the main goal.
|
|
21
|
+
reset()
|
|
22
|
+
})
|
|
21
23
|
|
|
22
24
|
return (
|
|
23
25
|
<Dynamic
|
|
@@ -29,7 +31,7 @@ export function CatchBoundary(
|
|
|
29
31
|
}}
|
|
30
32
|
>
|
|
31
33
|
{props.children}
|
|
32
|
-
</Solid.
|
|
34
|
+
</Solid.Errored>
|
|
33
35
|
)
|
|
34
36
|
}
|
|
35
37
|
|
|
@@ -41,7 +43,7 @@ export function ErrorComponent({ error }: { error: any }) {
|
|
|
41
43
|
return (
|
|
42
44
|
<div style={{ padding: '.5rem', 'max-width': '100%' }}>
|
|
43
45
|
<div style={{ display: 'flex', 'align-items': 'center', gap: '.5rem' }}>
|
|
44
|
-
|
|
46
|
+
∂<strong style={{ 'font-size': '1rem' }}>Something went wrong!</strong>
|
|
45
47
|
<button
|
|
46
48
|
style={{
|
|
47
49
|
appearance: 'none',
|
package/src/ClientOnly.tsx
CHANGED
|
@@ -58,8 +58,13 @@ export function ClientOnly(props: ClientOnlyProps) {
|
|
|
58
58
|
*/
|
|
59
59
|
export function useHydrated(): Solid.Accessor<boolean> {
|
|
60
60
|
const [hydrated, setHydrated] = Solid.createSignal(false)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
|
|
62
|
+
Solid.createEffect(
|
|
63
|
+
() => true,
|
|
64
|
+
() => {
|
|
65
|
+
setHydrated(true)
|
|
66
|
+
},
|
|
67
|
+
)
|
|
68
|
+
|
|
64
69
|
return hydrated
|
|
65
70
|
}
|
package/src/HeadContent.dev.tsx
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { MetaProvider } from '@solidjs/meta'
|
|
2
1
|
import { For, createEffect, createMemo } from 'solid-js'
|
|
3
2
|
import { Asset } from './Asset'
|
|
4
3
|
import { useHydrated } from './ClientOnly'
|
|
@@ -21,13 +20,16 @@ export function HeadContent() {
|
|
|
21
20
|
|
|
22
21
|
// Fallback cleanup for hydration mismatch cases
|
|
23
22
|
// Runs when hydration completes to remove any orphaned dev styles links from DOM
|
|
24
|
-
createEffect(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
23
|
+
createEffect(
|
|
24
|
+
() => [hydrated()] as const,
|
|
25
|
+
([hydrated]) => {
|
|
26
|
+
if (hydrated) {
|
|
27
|
+
document
|
|
28
|
+
.querySelectorAll(`link[${DEV_STYLES_ATTR}]`)
|
|
29
|
+
.forEach((el) => el.remove())
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
)
|
|
31
33
|
|
|
32
34
|
// Filter out dev styles after hydration
|
|
33
35
|
const filteredTags = createMemo(() => {
|
|
@@ -38,8 +40,11 @@ export function HeadContent() {
|
|
|
38
40
|
})
|
|
39
41
|
|
|
40
42
|
return (
|
|
41
|
-
<
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
<For each={filteredTags()}>
|
|
44
|
+
{(tag) => {
|
|
45
|
+
const t = tag() as any
|
|
46
|
+
return <Asset tag={t.tag} attrs={t.attrs} children={t.children} />
|
|
47
|
+
}}
|
|
48
|
+
</For>
|
|
44
49
|
)
|
|
45
50
|
}
|
package/src/HeadContent.tsx
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { MetaProvider } from '@solidjs/meta'
|
|
2
1
|
import { For } from 'solid-js'
|
|
3
2
|
import { Asset } from './Asset'
|
|
4
3
|
import { useTags } from './headContentUtils'
|
|
@@ -13,8 +12,11 @@ export function HeadContent() {
|
|
|
13
12
|
const tags = useTags()
|
|
14
13
|
|
|
15
14
|
return (
|
|
16
|
-
<
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
<For each={tags()}>
|
|
16
|
+
{(tag) => {
|
|
17
|
+
const t = tag() as any
|
|
18
|
+
return <Asset tag={t.tag} attrs={t.attrs} children={t.children} />
|
|
19
|
+
}}
|
|
20
|
+
</For>
|
|
19
21
|
)
|
|
20
22
|
}
|