@tanstack/vue-router 0.0.1 → 1.140.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/LICENSE +21 -0
- package/README.md +66 -45
- package/dist/esm/Asset.d.ts +2 -0
- package/dist/esm/Asset.js +33 -0
- package/dist/esm/Asset.js.map +1 -0
- package/dist/esm/CatchBoundary.d.ts +19 -0
- package/dist/esm/CatchBoundary.js +135 -0
- package/dist/esm/CatchBoundary.js.map +1 -0
- package/dist/esm/ClientOnly.d.ts +67 -0
- package/dist/esm/HeadContent.d.ts +10 -0
- package/dist/esm/HeadContent.js +116 -0
- package/dist/esm/HeadContent.js.map +1 -0
- package/dist/esm/Match.d.ts +25 -0
- package/dist/esm/Match.js +262 -0
- package/dist/esm/Match.js.map +1 -0
- package/dist/esm/Matches.d.ts +39 -0
- package/dist/esm/Matches.js +186 -0
- package/dist/esm/Matches.js.map +1 -0
- package/dist/esm/RouterProvider.d.ts +33 -0
- package/dist/esm/RouterProvider.js +65 -0
- package/dist/esm/RouterProvider.js.map +1 -0
- package/dist/esm/SafeFragment.d.ts +4 -0
- package/dist/esm/ScriptOnce.d.ts +5 -0
- package/dist/esm/ScriptOnce.js +21 -0
- package/dist/esm/ScriptOnce.js.map +1 -0
- package/dist/esm/Scripts.d.ts +1 -0
- package/dist/esm/Scripts.js +46 -0
- package/dist/esm/Scripts.js.map +1 -0
- package/dist/esm/ScrollRestoration.d.ts +14 -0
- package/dist/esm/ScrollRestoration.js +36 -0
- package/dist/esm/ScrollRestoration.js.map +1 -0
- package/dist/esm/Transitioner.d.ts +2 -0
- package/dist/esm/Transitioner.js +154 -0
- package/dist/esm/Transitioner.js.map +1 -0
- package/dist/esm/awaited.d.ts +12 -0
- package/dist/esm/awaited.js +40 -0
- package/dist/esm/awaited.js.map +1 -0
- package/dist/esm/fileRoute.d.ts +54 -0
- package/dist/esm/fileRoute.js +103 -0
- package/dist/esm/fileRoute.js.map +1 -0
- package/dist/esm/history.d.ts +8 -0
- package/dist/esm/index.d.ts +51 -0
- package/dist/esm/index.js +138 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lazyRouteComponent.d.ts +8 -0
- package/dist/esm/lazyRouteComponent.js +106 -0
- package/dist/esm/lazyRouteComponent.js.map +1 -0
- package/dist/esm/link.d.ts +61 -0
- package/dist/esm/link.js +376 -0
- package/dist/esm/link.js.map +1 -0
- package/dist/esm/matchContext.d.ts +20 -0
- package/dist/esm/matchContext.js +16 -0
- package/dist/esm/matchContext.js.map +1 -0
- package/dist/esm/not-found.d.ts +12 -0
- package/dist/esm/not-found.js +45 -0
- package/dist/esm/not-found.js.map +1 -0
- package/dist/esm/renderRouteNotFound.d.ts +11 -0
- package/dist/esm/renderRouteNotFound.js +19 -0
- package/dist/esm/renderRouteNotFound.js.map +1 -0
- package/dist/esm/route.d.ts +96 -0
- package/dist/esm/route.js +176 -0
- package/dist/esm/route.js.map +1 -0
- package/dist/esm/router.d.ts +69 -0
- package/dist/esm/router.js +14 -0
- package/dist/esm/router.js.map +1 -0
- package/dist/esm/routerContext.d.ts +21 -0
- package/dist/esm/routerContext.js +21 -0
- package/dist/esm/routerContext.js.map +1 -0
- package/dist/esm/scroll-restoration.d.ts +1 -0
- package/dist/esm/scroll-restoration.js +21 -0
- package/dist/esm/scroll-restoration.js.map +1 -0
- package/dist/esm/typePrimitives.d.ts +10 -0
- package/dist/esm/useBlocker.d.ts +66 -0
- package/dist/esm/useBlocker.js +295 -0
- package/dist/esm/useBlocker.js.map +1 -0
- package/dist/esm/useCanGoBack.d.ts +1 -0
- package/dist/esm/useCanGoBack.js +8 -0
- package/dist/esm/useCanGoBack.js.map +1 -0
- package/dist/esm/useLoaderData.d.ts +8 -0
- package/dist/esm/useLoaderData.js +14 -0
- package/dist/esm/useLoaderData.js.map +1 -0
- package/dist/esm/useLoaderDeps.d.ts +7 -0
- package/dist/esm/useLoaderDeps.js +17 -0
- package/dist/esm/useLoaderDeps.js.map +1 -0
- package/dist/esm/useLocation.d.ts +7 -0
- package/dist/esm/useLocation.js +10 -0
- package/dist/esm/useLocation.js.map +1 -0
- package/dist/esm/useMatch.d.ts +10 -0
- package/dist/esm/useMatch.js +39 -0
- package/dist/esm/useMatch.js.map +1 -0
- package/dist/esm/useNavigate.d.ts +5 -0
- package/dist/esm/useNavigate.js +29 -0
- package/dist/esm/useNavigate.js.map +1 -0
- package/dist/esm/useParams.d.ts +9 -0
- package/dist/esm/useParams.js +15 -0
- package/dist/esm/useParams.js.map +1 -0
- package/dist/esm/useRouteContext.d.ts +4 -0
- package/dist/esm/useRouteContext.js +11 -0
- package/dist/esm/useRouteContext.js.map +1 -0
- package/dist/esm/useRouter.d.ts +4 -0
- package/dist/esm/useRouter.js +12 -0
- package/dist/esm/useRouter.js.map +1 -0
- package/dist/esm/useRouterState.d.ts +8 -0
- package/dist/esm/useRouterState.js +20 -0
- package/dist/esm/useRouterState.js.map +1 -0
- package/dist/esm/useSearch.d.ts +9 -0
- package/dist/esm/useSearch.js +15 -0
- package/dist/esm/useSearch.js.map +1 -0
- package/dist/esm/utils.d.ts +40 -0
- package/dist/esm/utils.js +44 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/source/Asset.d.ts +2 -0
- package/dist/source/Asset.jsx +22 -0
- package/dist/source/Asset.jsx.map +1 -0
- package/dist/source/CatchBoundary.d.ts +19 -0
- package/dist/source/CatchBoundary.jsx +134 -0
- package/dist/source/CatchBoundary.jsx.map +1 -0
- package/dist/source/ClientOnly.d.ts +67 -0
- package/dist/source/ClientOnly.jsx +63 -0
- package/dist/source/ClientOnly.jsx.map +1 -0
- package/dist/source/HeadContent.d.ts +10 -0
- package/dist/source/HeadContent.jsx +133 -0
- package/dist/source/HeadContent.jsx.map +1 -0
- package/dist/source/Match.d.ts +25 -0
- package/dist/source/Match.jsx +316 -0
- package/dist/source/Match.jsx.map +1 -0
- package/dist/source/Matches.d.ts +39 -0
- package/dist/source/Matches.jsx +191 -0
- package/dist/source/Matches.jsx.map +1 -0
- package/dist/source/RouterProvider.d.ts +33 -0
- package/dist/source/RouterProvider.jsx +63 -0
- package/dist/source/RouterProvider.jsx.map +1 -0
- package/dist/source/SafeFragment.d.ts +4 -0
- package/dist/source/SafeFragment.jsx +10 -0
- package/dist/source/SafeFragment.jsx.map +1 -0
- package/dist/source/ScriptOnce.d.ts +5 -0
- package/dist/source/ScriptOnce.jsx +17 -0
- package/dist/source/ScriptOnce.jsx.map +1 -0
- package/dist/source/Scripts.d.ts +1 -0
- package/dist/source/Scripts.jsx +49 -0
- package/dist/source/Scripts.jsx.map +1 -0
- package/dist/source/ScrollRestoration.d.ts +14 -0
- package/dist/source/ScrollRestoration.jsx +37 -0
- package/dist/source/ScrollRestoration.jsx.map +1 -0
- package/dist/source/Transitioner.d.ts +2 -0
- package/dist/source/Transitioner.jsx +181 -0
- package/dist/source/Transitioner.jsx.map +1 -0
- package/dist/source/awaited.d.ts +12 -0
- package/dist/source/awaited.jsx +38 -0
- package/dist/source/awaited.jsx.map +1 -0
- package/dist/source/fileRoute.d.ts +54 -0
- package/dist/source/fileRoute.js +98 -0
- package/dist/source/fileRoute.js.map +1 -0
- package/dist/source/history.d.ts +8 -0
- package/dist/source/history.js +2 -0
- package/dist/source/history.js.map +1 -0
- package/dist/source/index.d.ts +51 -0
- package/dist/source/index.jsx +40 -0
- package/dist/source/index.jsx.map +1 -0
- package/dist/source/lazyRouteComponent.d.ts +8 -0
- package/dist/source/lazyRouteComponent.jsx +135 -0
- package/dist/source/lazyRouteComponent.jsx.map +1 -0
- package/dist/source/link.d.ts +61 -0
- package/dist/source/link.jsx +495 -0
- package/dist/source/link.jsx.map +1 -0
- package/dist/source/matchContext.d.ts +20 -0
- package/dist/source/matchContext.jsx +32 -0
- package/dist/source/matchContext.jsx.map +1 -0
- package/dist/source/not-found.d.ts +12 -0
- package/dist/source/not-found.jsx +48 -0
- package/dist/source/not-found.jsx.map +1 -0
- package/dist/source/renderRouteNotFound.d.ts +11 -0
- package/dist/source/renderRouteNotFound.jsx +24 -0
- package/dist/source/renderRouteNotFound.jsx.map +1 -0
- package/dist/source/route.d.ts +97 -0
- package/dist/source/route.js +167 -0
- package/dist/source/route.js.map +1 -0
- package/dist/source/router.d.ts +70 -0
- package/dist/source/router.js +10 -0
- package/dist/source/router.js.map +1 -0
- package/dist/source/routerContext.d.ts +21 -0
- package/dist/source/routerContext.jsx +37 -0
- package/dist/source/routerContext.jsx.map +1 -0
- package/dist/source/scroll-restoration.d.ts +1 -0
- package/dist/source/scroll-restoration.jsx +16 -0
- package/dist/source/scroll-restoration.jsx.map +1 -0
- package/dist/source/typePrimitives.d.ts +10 -0
- package/dist/source/typePrimitives.js +2 -0
- package/dist/source/typePrimitives.js.map +1 -0
- package/dist/source/useBlocker.d.ts +66 -0
- package/dist/source/useBlocker.jsx +308 -0
- package/dist/source/useBlocker.jsx.map +1 -0
- package/dist/source/useCanGoBack.d.ts +1 -0
- package/dist/source/useCanGoBack.js +5 -0
- package/dist/source/useCanGoBack.js.map +1 -0
- package/dist/source/useLoaderData.d.ts +8 -0
- package/dist/source/useLoaderData.jsx +11 -0
- package/dist/source/useLoaderData.jsx.map +1 -0
- package/dist/source/useLoaderDeps.d.ts +7 -0
- package/dist/source/useLoaderDeps.jsx +11 -0
- package/dist/source/useLoaderDeps.jsx.map +1 -0
- package/dist/source/useLocation.d.ts +7 -0
- package/dist/source/useLocation.jsx +7 -0
- package/dist/source/useLocation.jsx.map +1 -0
- package/dist/source/useMatch.d.ts +10 -0
- package/dist/source/useMatch.jsx +46 -0
- package/dist/source/useMatch.jsx.map +1 -0
- package/dist/source/useNavigate.d.ts +5 -0
- package/dist/source/useNavigate.jsx +18 -0
- package/dist/source/useNavigate.jsx.map +1 -0
- package/dist/source/useParams.d.ts +9 -0
- package/dist/source/useParams.jsx +12 -0
- package/dist/source/useParams.jsx.map +1 -0
- package/dist/source/useRouteContext.d.ts +4 -0
- package/dist/source/useRouteContext.js +8 -0
- package/dist/source/useRouteContext.js.map +1 -0
- package/dist/source/useRouter.d.ts +4 -0
- package/dist/source/useRouter.jsx +9 -0
- package/dist/source/useRouter.jsx.map +1 -0
- package/dist/source/useRouterState.d.ts +8 -0
- package/dist/source/useRouterState.jsx +19 -0
- package/dist/source/useRouterState.jsx.map +1 -0
- package/dist/source/useSearch.d.ts +9 -0
- package/dist/source/useSearch.jsx +12 -0
- package/dist/source/useSearch.jsx.map +1 -0
- package/dist/source/utils.d.ts +40 -0
- package/dist/source/utils.js +78 -0
- package/dist/source/utils.js.map +1 -0
- package/package.json +77 -7
- package/src/Asset.tsx +23 -0
- package/src/CatchBoundary.tsx +186 -0
- package/src/ClientOnly.tsx +75 -0
- package/src/HeadContent.tsx +159 -0
- package/src/Match.tsx +415 -0
- package/src/Matches.tsx +349 -0
- package/src/RouterProvider.tsx +117 -0
- package/src/SafeFragment.tsx +10 -0
- package/src/ScriptOnce.tsx +30 -0
- package/src/Scripts.tsx +65 -0
- package/src/ScrollRestoration.tsx +69 -0
- package/src/Transitioner.tsx +213 -0
- package/src/awaited.tsx +54 -0
- package/src/fileRoute.ts +271 -0
- package/src/history.ts +9 -0
- package/src/index.tsx +346 -0
- package/src/lazyRouteComponent.tsx +173 -0
- package/src/link.tsx +765 -0
- package/src/matchContext.tsx +41 -0
- package/src/not-found.tsx +55 -0
- package/src/renderRouteNotFound.tsx +35 -0
- package/src/route.ts +658 -0
- package/src/router.ts +103 -0
- package/src/routerContext.tsx +53 -0
- package/src/scroll-restoration.tsx +29 -0
- package/src/typePrimitives.ts +74 -0
- package/src/useBlocker.tsx +501 -0
- package/src/useCanGoBack.ts +5 -0
- package/src/useLoaderData.tsx +50 -0
- package/src/useLoaderDeps.tsx +46 -0
- package/src/useLocation.tsx +30 -0
- package/src/useMatch.tsx +127 -0
- package/src/useNavigate.tsx +40 -0
- package/src/useParams.tsx +71 -0
- package/src/useRouteContext.ts +31 -0
- package/src/useRouter.tsx +15 -0
- package/src/useRouterState.tsx +43 -0
- package/src/useSearch.tsx +71 -0
- package/src/utils.ts +111 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2021-present Tanner Linsley
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,45 +1,66 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
##
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
1
|
+
<img src="https://static.scarf.sh/a.png?x-pxid=d988eb79-b0fc-4a2b-8514-6a1ab932d188" />
|
|
2
|
+
|
|
3
|
+
# TanStack Solid Router
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
🤖 Type-safe router w/ built-in caching & URL state management for Solid!
|
|
8
|
+
|
|
9
|
+
<a href="https://twitter.com/intent/tweet?button_hashtag=TanStack" target="\_parent">
|
|
10
|
+
<img alt="#TanStack" src="https://img.shields.io/twitter/url?color=%2308a0e9&label=%23TanStack&style=social&url=https%3A%2F%2Ftwitter.com%2Fintent%2Ftweet%3Fbutton_hashtag%3DTanStack">
|
|
11
|
+
</a><a href="https://discord.com/invite/WrRKjPJ" target="\_parent">
|
|
12
|
+
<img alt="" src="https://img.shields.io/badge/Discord-TanStack-%235865F2" />
|
|
13
|
+
</a><a href="https://npmjs.com/package/@tanstack/solid-router" target="\_parent">
|
|
14
|
+
<img alt="" src="https://img.shields.io/npm/dm/@tanstack/router.svg" />
|
|
15
|
+
</a><a href="https://bundlephobia.com/result?p=@tanstack/solid-router" target="\_parent">
|
|
16
|
+
<img alt="" src="https://badgen.net/bundlephobia/minzip/@tanstack/solid-router" />
|
|
17
|
+
</a><a href="#badge">
|
|
18
|
+
<img alt="semantic-release" src="https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg">
|
|
19
|
+
</a><a href="https://github.com/tanstack/router/discussions">
|
|
20
|
+
<img alt="Join the discussion on Github" src="https://img.shields.io/badge/Github%20Discussions%20%26%20Support-Chat%20now!-blue" />
|
|
21
|
+
</a><a href="https://bestofjs.org/projects/router"><img alt="Best of JS" src="https://img.shields.io/endpoint?url=https://bestofjs-serverless.now.sh/api/project-badge?fullName=tanstack%2Frouter%26since=daily" /></a><a href="https://github.com/tanstack/router" target="\_parent">
|
|
22
|
+
<img alt="" src="https://img.shields.io/github/stars/tanstack/router.svg?style=social&label=Star" />
|
|
23
|
+
</a><a href="https://twitter.com/tan_stack" target="\_parent">
|
|
24
|
+
<img alt="" src="https://img.shields.io/twitter/follow/tan_stack.svg?style=social&label=Follow @TanStack" />
|
|
25
|
+
</a><a href="https://twitter.com/tannerlinsley" target="\_parent">
|
|
26
|
+
<img alt="" src="https://img.shields.io/twitter/follow/tannerlinsley.svg?style=social&label=Follow @TannerLinsley" />
|
|
27
|
+
</a>
|
|
28
|
+
|
|
29
|
+
## Visit [tanstack.com/router](https://tanstack.com/router) for docs, guides, API and more!
|
|
30
|
+
|
|
31
|
+
## File-Based Routing Conventions
|
|
32
|
+
|
|
33
|
+
| Suffix/Pattern | Purpose |
|
|
34
|
+
| ----------------------------------- | -------------------------------------------------------- |
|
|
35
|
+
| `.route.ts` | Route configuration (loader, validateSearch, head, etc.) |
|
|
36
|
+
| `.component.vue` | The component rendered for the route |
|
|
37
|
+
| `.errorComponent.vue` | Error boundary component for the route |
|
|
38
|
+
| `.notFoundComponent.vue` | Not found component for the route |
|
|
39
|
+
| `.lazy.ts` | Lazy-loaded route configuration |
|
|
40
|
+
| `_layout` prefix | Layout routes that wrap child routes |
|
|
41
|
+
| `_` suffix (e.g., `posts_.$postId`) | Unnested routes (break out of parent layout) |
|
|
42
|
+
| `(groupName)` directory | Route groups (organizational, don't affect URL) |
|
|
43
|
+
| `$param` | Dynamic route parameters |
|
|
44
|
+
|
|
45
|
+
### Examples from e2e/basic-file-routes/ project
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
src/routes/
|
|
49
|
+
├── __root.ts # Root route config
|
|
50
|
+
├── __root.component.vue # Root layout component
|
|
51
|
+
├── __root.notFoundComponent.vue # Global not found component
|
|
52
|
+
├── index.route.ts # "/" route config
|
|
53
|
+
├── index.component.vue # "/" component
|
|
54
|
+
├── posts.route.ts # "/posts" route config
|
|
55
|
+
├── posts.component.vue # "/posts" layout component
|
|
56
|
+
├── posts.index.component.vue # "/posts" index component
|
|
57
|
+
├── posts.$postId.route.ts # "/posts/:postId" route config
|
|
58
|
+
├── posts.$postId.component.vue # "/posts/:postId" component
|
|
59
|
+
├── posts.$postId.errorComponent.vue # Error boundary for post
|
|
60
|
+
├── posts_.$postId.edit.route.ts # "/posts/:postId/edit" (unnested)
|
|
61
|
+
├── (group)/ # Route group (no URL impact)
|
|
62
|
+
│ ├── _layout.route.ts # Layout for group
|
|
63
|
+
│ ├── _layout.component.vue
|
|
64
|
+
│ └── inside.component.vue # "/inside"
|
|
65
|
+
└── 대한민국.component.vue # Unicode routes supported
|
|
66
|
+
```
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { createVNode, mergeProps } from "vue";
|
|
2
|
+
function Asset({
|
|
3
|
+
tag,
|
|
4
|
+
attrs,
|
|
5
|
+
children
|
|
6
|
+
}) {
|
|
7
|
+
switch (tag) {
|
|
8
|
+
case "title":
|
|
9
|
+
return createVNode("title", attrs, [children]);
|
|
10
|
+
case "meta":
|
|
11
|
+
return createVNode("meta", attrs, null);
|
|
12
|
+
case "link":
|
|
13
|
+
return createVNode("link", attrs, null);
|
|
14
|
+
case "style":
|
|
15
|
+
return createVNode("style", mergeProps(attrs, {
|
|
16
|
+
"innerHTML": children
|
|
17
|
+
}), null);
|
|
18
|
+
case "script":
|
|
19
|
+
if (attrs && attrs.src) {
|
|
20
|
+
return createVNode("script", attrs, null);
|
|
21
|
+
}
|
|
22
|
+
if (typeof children === "string") return createVNode("script", mergeProps(attrs, {
|
|
23
|
+
"innerHTML": children
|
|
24
|
+
}), null);
|
|
25
|
+
return null;
|
|
26
|
+
default:
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
Asset
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=Asset.js.map
|
|
@@ -0,0 +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 <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","_createVNode","_mergeProps","src"],"mappings":";AAEO,SAASA,MAAM;AAAA,EAAEC;AAAAA,EAAKC;AAAAA,EAAOC;AAA2B,GAAQ;AACrE,UAAQF,KAAG;AAAA,IACT,KAAK;AACH,aAAAG,YAAA,SAAkBF,OAAK,CAAGC,QAAQ,CAAA;AAAA,IACpC,KAAK;AACH,aAAAC,oBAAiBF,OAAK,IAAA;AAAA,IACxB,KAAK;AACH,aAAAE,oBAAiBF,OAAK,IAAA;AAAA,IACxB,KAAK;AACH,aAAAE,YAAA,SAAAC,WAAkBH,OAAK;AAAA,QAAA,aAAaC;AAAAA,MAAQ,CAAA,GAAA,IAAA;AAAA,IAC9C,KAAK;AACH,UAAKD,SAAkBA,MAAcI,KAAK;AACxC,eAAAF,sBAAmBF,OAAK,IAAA;AAAA,MAC1B;AACA,UAAI,OAAOC,aAAa,SACtB,QAAAC,YAAA,UAAAC,WAAmBH,OAAK;AAAA,QAAA,aAAaC;AAAAA,MAAQ,CAAA,GAAA,IAAA;AAC/C,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ErrorRouteComponent } from './route.js';
|
|
2
|
+
import * as Vue from 'vue';
|
|
3
|
+
export declare function CatchBoundary(props: {
|
|
4
|
+
getResetKey: () => number | string;
|
|
5
|
+
children: Vue.VNode;
|
|
6
|
+
errorComponent?: ErrorRouteComponent;
|
|
7
|
+
onCatch?: (error: Error) => void;
|
|
8
|
+
}): Vue.VNode<Vue.RendererNode, Vue.RendererElement, {
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}>;
|
|
11
|
+
export declare const ErrorComponent: Vue.DefineComponent<Vue.ExtractPropTypes<{
|
|
12
|
+
error: ObjectConstructor;
|
|
13
|
+
reset: FunctionConstructor;
|
|
14
|
+
}>, () => Vue.VNode<Vue.RendererNode, Vue.RendererElement, {
|
|
15
|
+
[key: string]: any;
|
|
16
|
+
}>, {}, {}, {}, Vue.ComponentOptionsMixin, Vue.ComponentOptionsMixin, {}, string, Vue.PublicProps, Readonly<Vue.ExtractPropTypes<{
|
|
17
|
+
error: ObjectConstructor;
|
|
18
|
+
reset: FunctionConstructor;
|
|
19
|
+
}>> & Readonly<{}>, {}, {}, {}, {}, string, Vue.ComponentProvideOptions, true, {}, any>;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import * as Vue from "vue";
|
|
2
|
+
const VueErrorBoundary = Vue.defineComponent({
|
|
3
|
+
name: "VueErrorBoundary",
|
|
4
|
+
props: {
|
|
5
|
+
onError: Function,
|
|
6
|
+
resetKey: [String, Number]
|
|
7
|
+
},
|
|
8
|
+
emits: ["catch"],
|
|
9
|
+
setup(props, {
|
|
10
|
+
slots
|
|
11
|
+
}) {
|
|
12
|
+
const error = Vue.ref(null);
|
|
13
|
+
const resetFn = Vue.ref(null);
|
|
14
|
+
const reset = () => {
|
|
15
|
+
error.value = null;
|
|
16
|
+
};
|
|
17
|
+
Vue.watch(() => props.resetKey, (newKey, oldKey) => {
|
|
18
|
+
if (newKey !== oldKey && error.value) {
|
|
19
|
+
reset();
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
Vue.onErrorCaptured((err) => {
|
|
23
|
+
if (err instanceof Promise || err && typeof err.then === "function") {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
error.value = err;
|
|
27
|
+
resetFn.value = reset;
|
|
28
|
+
if (props.onError) {
|
|
29
|
+
props.onError(err);
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
});
|
|
33
|
+
return () => {
|
|
34
|
+
if (error.value && slots.fallback) {
|
|
35
|
+
return slots.fallback({
|
|
36
|
+
error: error.value,
|
|
37
|
+
reset
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return slots.default && slots.default();
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
function CatchBoundary(props) {
|
|
45
|
+
const CatchBoundaryWrapper = Vue.defineComponent({
|
|
46
|
+
name: "CatchBoundaryWrapper",
|
|
47
|
+
inheritAttrs: false,
|
|
48
|
+
setup() {
|
|
49
|
+
const resetKey = Vue.computed(() => props.getResetKey());
|
|
50
|
+
return () => {
|
|
51
|
+
const defaultErrorComponent = ErrorComponent;
|
|
52
|
+
return Vue.h(VueErrorBoundary, {
|
|
53
|
+
resetKey: resetKey.value,
|
|
54
|
+
onError: props.onCatch
|
|
55
|
+
}, {
|
|
56
|
+
default: () => props.children,
|
|
57
|
+
fallback: ({
|
|
58
|
+
error,
|
|
59
|
+
reset
|
|
60
|
+
}) => {
|
|
61
|
+
if (props.errorComponent) {
|
|
62
|
+
return Vue.h(props.errorComponent, {
|
|
63
|
+
error,
|
|
64
|
+
reset
|
|
65
|
+
});
|
|
66
|
+
} else {
|
|
67
|
+
return Vue.h(defaultErrorComponent, {
|
|
68
|
+
error,
|
|
69
|
+
reset
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
return Vue.h(CatchBoundaryWrapper);
|
|
78
|
+
}
|
|
79
|
+
const ErrorComponent = Vue.defineComponent({
|
|
80
|
+
name: "ErrorComponent",
|
|
81
|
+
props: {
|
|
82
|
+
error: Object,
|
|
83
|
+
reset: Function
|
|
84
|
+
},
|
|
85
|
+
setup(props) {
|
|
86
|
+
const show = Vue.ref(process.env.NODE_ENV !== "production");
|
|
87
|
+
const toggleShow = () => {
|
|
88
|
+
show.value = !show.value;
|
|
89
|
+
};
|
|
90
|
+
return () => Vue.h("div", {
|
|
91
|
+
style: {
|
|
92
|
+
padding: ".5rem",
|
|
93
|
+
maxWidth: "100%"
|
|
94
|
+
}
|
|
95
|
+
}, [Vue.h("div", {
|
|
96
|
+
style: {
|
|
97
|
+
display: "flex",
|
|
98
|
+
alignItems: "center",
|
|
99
|
+
gap: ".5rem"
|
|
100
|
+
}
|
|
101
|
+
}, [Vue.h("strong", {
|
|
102
|
+
style: {
|
|
103
|
+
fontSize: "1rem"
|
|
104
|
+
}
|
|
105
|
+
}, "Something went wrong!"), Vue.h("button", {
|
|
106
|
+
style: {
|
|
107
|
+
appearance: "none",
|
|
108
|
+
fontSize: ".6em",
|
|
109
|
+
border: "1px solid currentColor",
|
|
110
|
+
padding: ".1rem .2rem",
|
|
111
|
+
fontWeight: "bold",
|
|
112
|
+
borderRadius: ".25rem"
|
|
113
|
+
},
|
|
114
|
+
onClick: toggleShow
|
|
115
|
+
}, show.value ? "Hide Error" : "Show Error")]), Vue.h("div", {
|
|
116
|
+
style: {
|
|
117
|
+
height: ".25rem"
|
|
118
|
+
}
|
|
119
|
+
}), show.value ? Vue.h("div", {}, [Vue.h("pre", {
|
|
120
|
+
style: {
|
|
121
|
+
fontSize: ".7em",
|
|
122
|
+
border: "1px solid red",
|
|
123
|
+
borderRadius: ".25rem",
|
|
124
|
+
padding: ".3rem",
|
|
125
|
+
color: "red",
|
|
126
|
+
overflow: "auto"
|
|
127
|
+
}
|
|
128
|
+
}, [props.error?.message ? Vue.h("code", {}, props.error.message) : null])]) : null]);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
export {
|
|
132
|
+
CatchBoundary,
|
|
133
|
+
ErrorComponent
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=CatchBoundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CatchBoundary.js","sources":["../../src/CatchBoundary.tsx"],"sourcesContent":["import * as Vue from 'vue'\nimport type { ErrorRouteComponent } from './route'\n\n// Define the error component props interface\ninterface ErrorComponentProps {\n error: Error\n reset: () => void\n}\n\n// Create a Vue error boundary component\nconst VueErrorBoundary = Vue.defineComponent({\n name: 'VueErrorBoundary',\n props: {\n onError: Function,\n resetKey: [String, Number],\n },\n emits: ['catch'],\n setup(props, { slots }) {\n const error = Vue.ref<Error | null>(null)\n const resetFn = Vue.ref<(() => void) | null>(null)\n\n const reset = () => {\n error.value = null\n }\n\n // Watch for changes in the reset key\n Vue.watch(\n () => props.resetKey,\n (newKey, oldKey) => {\n if (newKey !== oldKey && error.value) {\n reset()\n }\n },\n )\n\n // Capture errors from child components\n Vue.onErrorCaptured((err: Error) => {\n // If the error is a Promise (thrown for Suspense), don't treat it as an error\n // Just ignore it - Suspense will handle it\n if (\n err instanceof Promise ||\n (err && typeof (err as any).then === 'function')\n ) {\n return false // Prevent from propagating as an error, but don't set error state\n }\n\n error.value = err\n resetFn.value = reset\n\n // Call the onError callback if provided\n if (props.onError) {\n props.onError(err)\n }\n\n // Prevent the error from propagating further\n return false\n })\n\n return () => {\n // If there's an error, render the fallback\n if (error.value && slots.fallback) {\n return slots.fallback({\n error: error.value,\n reset,\n })\n }\n\n // Otherwise render the default slot\n return slots.default && slots.default()\n }\n },\n})\n\n// Main CatchBoundary component\nexport function CatchBoundary(props: {\n getResetKey: () => number | string\n children: Vue.VNode\n errorComponent?: ErrorRouteComponent\n onCatch?: (error: Error) => void\n}) {\n // Create a component to use in the template\n const CatchBoundaryWrapper = Vue.defineComponent({\n name: 'CatchBoundaryWrapper',\n inheritAttrs: false,\n setup() {\n const resetKey = Vue.computed(() => props.getResetKey())\n\n return () => {\n // Always use our default component as a safe fallback\n const defaultErrorComponent = ErrorComponent\n\n return Vue.h(\n VueErrorBoundary,\n {\n resetKey: resetKey.value,\n onError: props.onCatch,\n },\n {\n default: () => props.children,\n fallback: ({ error, reset }: ErrorComponentProps) => {\n // Safely render the error component - either the provided one or the default\n if (props.errorComponent) {\n // Use the provided error component\n return Vue.h(props.errorComponent, { error, reset })\n } else {\n // Use the default error component\n return Vue.h(defaultErrorComponent, { error, reset })\n }\n },\n },\n )\n }\n },\n })\n\n return Vue.h(CatchBoundaryWrapper)\n}\n\n// Error component\nexport const ErrorComponent = Vue.defineComponent({\n name: 'ErrorComponent',\n props: {\n error: Object,\n reset: Function,\n },\n setup(props) {\n const show = Vue.ref(process.env.NODE_ENV !== 'production')\n\n const toggleShow = () => {\n show.value = !show.value\n }\n\n return () =>\n Vue.h('div', { style: { padding: '.5rem', maxWidth: '100%' } }, [\n Vue.h(\n 'div',\n { style: { display: 'flex', alignItems: 'center', gap: '.5rem' } },\n [\n Vue.h(\n 'strong',\n { style: { fontSize: '1rem' } },\n 'Something went wrong!',\n ),\n Vue.h(\n 'button',\n {\n style: {\n appearance: 'none',\n fontSize: '.6em',\n border: '1px solid currentColor',\n padding: '.1rem .2rem',\n fontWeight: 'bold',\n borderRadius: '.25rem',\n },\n onClick: toggleShow,\n },\n show.value ? 'Hide Error' : 'Show Error',\n ),\n ],\n ),\n Vue.h('div', { style: { height: '.25rem' } }),\n show.value\n ? Vue.h('div', {}, [\n Vue.h(\n 'pre',\n {\n style: {\n fontSize: '.7em',\n border: '1px solid red',\n borderRadius: '.25rem',\n padding: '.3rem',\n color: 'red',\n overflow: 'auto',\n },\n },\n [\n props.error?.message\n ? Vue.h('code', {}, props.error.message)\n : null,\n ],\n ),\n ])\n : null,\n ])\n },\n})\n"],"names":["VueErrorBoundary","Vue","defineComponent","name","props","onError","Function","resetKey","String","Number","emits","setup","slots","error","ref","resetFn","reset","value","watch","newKey","oldKey","onErrorCaptured","err","Promise","then","fallback","default","CatchBoundary","CatchBoundaryWrapper","inheritAttrs","computed","getResetKey","defaultErrorComponent","ErrorComponent","h","onCatch","children","errorComponent","Object","show","process","env","NODE_ENV","toggleShow","style","padding","maxWidth","display","alignItems","gap","fontSize","appearance","border","fontWeight","borderRadius","onClick","height","color","overflow","message"],"mappings":";AAUA,MAAMA,mBAAmBC,IAAIC,gBAAgB;AAAA,EAC3CC,MAAM;AAAA,EACNC,OAAO;AAAA,IACLC,SAASC;AAAAA,IACTC,UAAU,CAACC,QAAQC,MAAM;AAAA;EAE3BC,OAAO,CAAC,OAAO;AAAA,EACfC,MAAMP,OAAO;AAAA,IAAEQ;AAAAA,EAAM,GAAG;AACtB,UAAMC,QAAQZ,IAAIa,IAAkB,IAAI;AACxC,UAAMC,UAAUd,IAAIa,IAAyB,IAAI;AAEjD,UAAME,QAAQA,MAAM;AAClBH,YAAMI,QAAQ;AAAA,IAChB;AAGAhB,QAAIiB,MACF,MAAMd,MAAMG,UACZ,CAACY,QAAQC,WAAW;AAClB,UAAID,WAAWC,UAAUP,MAAMI,OAAO;AACpCD,cAAK;AAAA,MACP;AAAA,IACF,CACF;AAGAf,QAAIoB,gBAAiBC,SAAe;AAGlC,UACEA,eAAeC,WACdD,OAAO,OAAQA,IAAYE,SAAS,YACrC;AACA,eAAO;AAAA,MACT;AAEAX,YAAMI,QAAQK;AACdP,cAAQE,QAAQD;AAGhB,UAAIZ,MAAMC,SAAS;AACjBD,cAAMC,QAAQiB,GAAG;AAAA,MACnB;AAGA,aAAO;AAAA,IACT,CAAC;AAED,WAAO,MAAM;AAEX,UAAIT,MAAMI,SAASL,MAAMa,UAAU;AACjC,eAAOb,MAAMa,SAAS;AAAA,UACpBZ,OAAOA,MAAMI;AAAAA,UACbD;AAAAA,QACF,CAAC;AAAA,MACH;AAGA,aAAOJ,MAAMc,WAAWd,MAAMc,QAAO;AAAA,IACvC;AAAA,EACF;AACF,CAAC;AAGM,SAASC,cAAcvB,OAK3B;AAED,QAAMwB,uBAAuB3B,IAAIC,gBAAgB;AAAA,IAC/CC,MAAM;AAAA,IACN0B,cAAc;AAAA,IACdlB,QAAQ;AACN,YAAMJ,WAAWN,IAAI6B,SAAS,MAAM1B,MAAM2B,YAAW,CAAE;AAEvD,aAAO,MAAM;AAEX,cAAMC,wBAAwBC;AAE9B,eAAOhC,IAAIiC,EACTlC,kBACA;AAAA,UACEO,UAAUA,SAASU;AAAAA,UACnBZ,SAASD,MAAM+B;AAAAA,QACjB,GACA;AAAA,UACET,SAASA,MAAMtB,MAAMgC;AAAAA,UACrBX,UAAUA,CAAC;AAAA,YAAEZ;AAAAA,YAAOG;AAAAA,UAA2B,MAAM;AAEnD,gBAAIZ,MAAMiC,gBAAgB;AAExB,qBAAOpC,IAAIiC,EAAE9B,MAAMiC,gBAAgB;AAAA,gBAAExB;AAAAA,gBAAOG;AAAAA,cAAM,CAAC;AAAA,YACrD,OAAO;AAEL,qBAAOf,IAAIiC,EAAEF,uBAAuB;AAAA,gBAAEnB;AAAAA,gBAAOG;AAAAA,cAAM,CAAC;AAAA,YACtD;AAAA,UACF;AAAA,QACF,CACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAOf,IAAIiC,EAAEN,oBAAoB;AACnC;MAGaK,iBAAiBhC,IAAIC,gBAAgB;AAAA,EAChDC,MAAM;AAAA,EACNC,OAAO;AAAA,IACLS,OAAOyB;AAAAA,IACPtB,OAAOV;AAAAA;EAETK,MAAMP,OAAO;AACX,UAAMmC,OAAOtC,IAAIa,IAAI0B,QAAQC,IAAIC,aAAa,YAAY;AAE1D,UAAMC,aAAaA,MAAM;AACvBJ,WAAKtB,QAAQ,CAACsB,KAAKtB;AAAAA,IACrB;AAEA,WAAO,MACLhB,IAAIiC,EAAE,OAAO;AAAA,MAAEU,OAAO;AAAA,QAAEC,SAAS;AAAA,QAASC,UAAU;AAAA,MAAO;AAAA,IAAE,GAAG,CAC9D7C,IAAIiC,EACF,OACA;AAAA,MAAEU,OAAO;AAAA,QAAEG,SAAS;AAAA,QAAQC,YAAY;AAAA,QAAUC,KAAK;AAAA,MAAQ;AAAA,IAAE,GACjE,CACEhD,IAAIiC,EACF,UACA;AAAA,MAAEU,OAAO;AAAA,QAAEM,UAAU;AAAA,MAAO;AAAA,OAC5B,uBACF,GACAjD,IAAIiC,EACF,UACA;AAAA,MACEU,OAAO;AAAA,QACLO,YAAY;AAAA,QACZD,UAAU;AAAA,QACVE,QAAQ;AAAA,QACRP,SAAS;AAAA,QACTQ,YAAY;AAAA,QACZC,cAAc;AAAA;MAEhBC,SAASZ;AAAAA,IACX,GACAJ,KAAKtB,QAAQ,eAAe,YAC9B,CAAC,CAEL,GACAhB,IAAIiC,EAAE,OAAO;AAAA,MAAEU,OAAO;AAAA,QAAEY,QAAQ;AAAA,MAAS;AAAA,KAAG,GAC5CjB,KAAKtB,QACDhB,IAAIiC,EAAE,OAAO,CAAA,GAAI,CACfjC,IAAIiC,EACF,OACA;AAAA,MACEU,OAAO;AAAA,QACLM,UAAU;AAAA,QACVE,QAAQ;AAAA,QACRE,cAAc;AAAA,QACdT,SAAS;AAAA,QACTY,OAAO;AAAA,QACPC,UAAU;AAAA,MACZ;AAAA,IACF,GACA,CACEtD,MAAMS,OAAO8C,UACT1D,IAAIiC,EAAE,QAAQ,CAAA,GAAI9B,MAAMS,MAAM8C,OAAO,IACrC,IAAI,CAEZ,CAAC,CACF,IACD,IAAI,CACT;AAAA,EACL;AACF,CAAC;"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import * as Vue from 'vue';
|
|
2
|
+
export interface ClientOnlyProps {
|
|
3
|
+
/**
|
|
4
|
+
* The children to render when the JS is loaded.
|
|
5
|
+
*/
|
|
6
|
+
children?: Vue.VNode;
|
|
7
|
+
/**
|
|
8
|
+
* The fallback component to render if the JS is not yet loaded.
|
|
9
|
+
*/
|
|
10
|
+
fallback?: Vue.VNode;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Render the children only after the JS has loaded client-side. Use an optional
|
|
14
|
+
* fallback component if the JS is not yet loaded.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* Render a Chart component if JS loads, renders a simple FakeChart
|
|
18
|
+
* component server-side or if there is no JS. The FakeChart can have only the
|
|
19
|
+
* UI without the behavior or be a loading spinner or skeleton.
|
|
20
|
+
*
|
|
21
|
+
* ```tsx
|
|
22
|
+
* return (
|
|
23
|
+
* <ClientOnly fallback={<FakeChart />}>
|
|
24
|
+
* <Chart />
|
|
25
|
+
* </ClientOnly>
|
|
26
|
+
* )
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare const ClientOnly: Vue.DefineComponent<Vue.ExtractPropTypes<{
|
|
30
|
+
fallback: {
|
|
31
|
+
type: Vue.PropType<Vue.VNode>;
|
|
32
|
+
default: null;
|
|
33
|
+
};
|
|
34
|
+
}>, () => Vue.VNode<Vue.RendererNode, Vue.RendererElement, {
|
|
35
|
+
[key: string]: any;
|
|
36
|
+
}> | Vue.VNode<Vue.RendererNode, Vue.RendererElement, {
|
|
37
|
+
[key: string]: any;
|
|
38
|
+
}>[] | undefined, {}, {}, {}, Vue.ComponentOptionsMixin, Vue.ComponentOptionsMixin, {}, string, Vue.PublicProps, Readonly<Vue.ExtractPropTypes<{
|
|
39
|
+
fallback: {
|
|
40
|
+
type: Vue.PropType<Vue.VNode>;
|
|
41
|
+
default: null;
|
|
42
|
+
};
|
|
43
|
+
}>> & Readonly<{}>, {
|
|
44
|
+
fallback: Vue.VNode<Vue.RendererNode, Vue.RendererElement, {
|
|
45
|
+
[key: string]: any;
|
|
46
|
+
}>;
|
|
47
|
+
}, {}, {}, {}, string, Vue.ComponentProvideOptions, true, {}, any>;
|
|
48
|
+
/**
|
|
49
|
+
* Return a boolean indicating if the JS has been hydrated already.
|
|
50
|
+
* When doing Server-Side Rendering, the result will always be false.
|
|
51
|
+
* When doing Client-Side Rendering, the result will always be false on the
|
|
52
|
+
* first render and true from then on. Even if a new component renders it will
|
|
53
|
+
* always start with true.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```tsx
|
|
57
|
+
* // Disable a button that needs JS to work.
|
|
58
|
+
* const hydrated = useHydrated()
|
|
59
|
+
* return (
|
|
60
|
+
* <button type="button" disabled={!hydrated.value} onClick={doSomethingCustom}>
|
|
61
|
+
* Click me
|
|
62
|
+
* </button>
|
|
63
|
+
* )
|
|
64
|
+
* ```
|
|
65
|
+
* @returns True if the JS has been hydrated already, false otherwise.
|
|
66
|
+
*/
|
|
67
|
+
export declare function useHydrated(): Vue.Ref<boolean>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { RouterManagedTag } from '@tanstack/router-core';
|
|
2
|
+
import * as Vue from 'vue';
|
|
3
|
+
export declare const useTags: () => () => RouterManagedTag[];
|
|
4
|
+
/**
|
|
5
|
+
* @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.
|
|
6
|
+
* It should be rendered in the `<head>` of your document.
|
|
7
|
+
*/
|
|
8
|
+
export declare const HeadContent: Vue.DefineComponent<{}, () => Vue.VNode<Vue.RendererNode, Vue.RendererElement, {
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}>[], {}, {}, {}, Vue.ComponentOptionsMixin, Vue.ComponentOptionsMixin, {}, string, Vue.PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, Vue.ComponentProvideOptions, true, {}, any>;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import * as Vue from "vue";
|
|
2
|
+
import { Asset } from "./Asset.js";
|
|
3
|
+
import { useRouter } from "./useRouter.js";
|
|
4
|
+
import { useRouterState } from "./useRouterState.js";
|
|
5
|
+
const useTags = () => {
|
|
6
|
+
const router = useRouter();
|
|
7
|
+
const routeMeta = useRouterState({
|
|
8
|
+
select: (state) => {
|
|
9
|
+
return state.matches.map((match) => match.meta).filter(Boolean);
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
const meta = Vue.computed(() => {
|
|
13
|
+
const resultMeta = [];
|
|
14
|
+
const metaByAttribute = {};
|
|
15
|
+
let title;
|
|
16
|
+
[...routeMeta.value].reverse().forEach((metas) => {
|
|
17
|
+
[...metas].reverse().forEach((m) => {
|
|
18
|
+
if (!m) return;
|
|
19
|
+
if (m.title) {
|
|
20
|
+
if (!title) {
|
|
21
|
+
title = {
|
|
22
|
+
tag: "title",
|
|
23
|
+
children: m.title
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
} else {
|
|
27
|
+
const attribute = m.name ?? m.property;
|
|
28
|
+
if (attribute) {
|
|
29
|
+
if (metaByAttribute[attribute]) {
|
|
30
|
+
return;
|
|
31
|
+
} else {
|
|
32
|
+
metaByAttribute[attribute] = true;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
resultMeta.push({
|
|
36
|
+
tag: "meta",
|
|
37
|
+
attrs: {
|
|
38
|
+
...m
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
if (title) {
|
|
45
|
+
resultMeta.push(title);
|
|
46
|
+
}
|
|
47
|
+
resultMeta.reverse();
|
|
48
|
+
return resultMeta;
|
|
49
|
+
});
|
|
50
|
+
const links = useRouterState({
|
|
51
|
+
select: (state) => state.matches.map((match) => match.links).filter(Boolean).flat(1).map((link) => ({
|
|
52
|
+
tag: "link",
|
|
53
|
+
attrs: {
|
|
54
|
+
...link
|
|
55
|
+
}
|
|
56
|
+
}))
|
|
57
|
+
});
|
|
58
|
+
const preloadMeta = useRouterState({
|
|
59
|
+
select: (state) => {
|
|
60
|
+
const preloadMeta2 = [];
|
|
61
|
+
state.matches.map((match) => router.looseRoutesById[match.routeId]).forEach((route) => router.ssr?.manifest?.routes[route.id]?.preloads?.filter(Boolean).forEach((preload) => {
|
|
62
|
+
preloadMeta2.push({
|
|
63
|
+
tag: "link",
|
|
64
|
+
attrs: {
|
|
65
|
+
rel: "modulepreload",
|
|
66
|
+
href: preload
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}));
|
|
70
|
+
return preloadMeta2;
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
const headScripts = useRouterState({
|
|
74
|
+
select: (state) => state.matches.map((match) => match.headScripts).flat(1).filter(Boolean).map(({
|
|
75
|
+
children,
|
|
76
|
+
...script
|
|
77
|
+
}) => ({
|
|
78
|
+
tag: "script",
|
|
79
|
+
attrs: {
|
|
80
|
+
...script
|
|
81
|
+
},
|
|
82
|
+
children
|
|
83
|
+
}))
|
|
84
|
+
});
|
|
85
|
+
return () => uniqBy([...meta.value, ...preloadMeta.value, ...links.value, ...headScripts.value], (d) => {
|
|
86
|
+
return JSON.stringify(d);
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
const HeadContent = Vue.defineComponent({
|
|
90
|
+
name: "HeadContent",
|
|
91
|
+
setup() {
|
|
92
|
+
const tags = useTags();
|
|
93
|
+
return () => {
|
|
94
|
+
return tags().map((tag) => Vue.h(Asset, {
|
|
95
|
+
...tag,
|
|
96
|
+
key: `tsr-meta-${JSON.stringify(tag)}`
|
|
97
|
+
}));
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
function uniqBy(arr, fn) {
|
|
102
|
+
const seen = /* @__PURE__ */ new Set();
|
|
103
|
+
return arr.filter((item) => {
|
|
104
|
+
const key = fn(item);
|
|
105
|
+
if (seen.has(key)) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
seen.add(key);
|
|
109
|
+
return true;
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
export {
|
|
113
|
+
HeadContent,
|
|
114
|
+
useTags
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=HeadContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeadContent.js","sources":["../../src/HeadContent.tsx"],"sourcesContent":["import * as Vue from 'vue'\n\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: Vue.Ref<Array<RouterManagedTag>> = Vue.computed(() => {\n const resultMeta: Array<RouterManagedTag> = []\n const metaByAttribute: Record<string, true> = {}\n let title: RouterManagedTag | undefined\n ;[...routeMeta.value].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.value,\n ...preloadMeta.value,\n ...links.value,\n ...headScripts.value,\n ] as Array<RouterManagedTag>,\n (d) => {\n return JSON.stringify(d)\n },\n )\n}\n\n/**\n * @description The `HeadContent` component is used to render meta tags, links, and scripts for the current route.\n * It should be rendered in the `<head>` of your document.\n */\nexport const HeadContent = Vue.defineComponent({\n name: 'HeadContent',\n setup() {\n const tags = useTags()\n\n return () => {\n return tags().map((tag) =>\n Vue.h(Asset, {\n ...tag,\n key: `tsr-meta-${JSON.stringify(tag)}`,\n }),\n )\n }\n },\n})\n\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","Vue","computed","resultMeta","metaByAttribute","title","value","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","defineComponent","setup","tags","h","Asset","key","arr","fn","seen","Set","item","has","add"],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { VNode } from 'vue';
|
|
2
|
+
import * as Vue from 'vue';
|
|
3
|
+
export declare const Match: Vue.DefineComponent<Vue.ExtractPropTypes<{
|
|
4
|
+
matchId: {
|
|
5
|
+
type: StringConstructor;
|
|
6
|
+
required: true;
|
|
7
|
+
};
|
|
8
|
+
}>, () => VNode, {}, {}, {}, Vue.ComponentOptionsMixin, Vue.ComponentOptionsMixin, {}, string, Vue.PublicProps, Readonly<Vue.ExtractPropTypes<{
|
|
9
|
+
matchId: {
|
|
10
|
+
type: StringConstructor;
|
|
11
|
+
required: true;
|
|
12
|
+
};
|
|
13
|
+
}>> & Readonly<{}>, {}, {}, {}, {}, string, Vue.ComponentProvideOptions, true, {}, any>;
|
|
14
|
+
export declare const MatchInner: Vue.DefineComponent<Vue.ExtractPropTypes<{
|
|
15
|
+
matchId: {
|
|
16
|
+
type: StringConstructor;
|
|
17
|
+
required: true;
|
|
18
|
+
};
|
|
19
|
+
}>, () => VNode | null, {}, {}, {}, Vue.ComponentOptionsMixin, Vue.ComponentOptionsMixin, {}, string, Vue.PublicProps, Readonly<Vue.ExtractPropTypes<{
|
|
20
|
+
matchId: {
|
|
21
|
+
type: StringConstructor;
|
|
22
|
+
required: true;
|
|
23
|
+
};
|
|
24
|
+
}>> & Readonly<{}>, {}, {}, {}, {}, string, Vue.ComponentProvideOptions, true, {}, any>;
|
|
25
|
+
export declare const Outlet: Vue.DefineComponent<{}, () => VNode | null, {}, {}, {}, Vue.ComponentOptionsMixin, Vue.ComponentOptionsMixin, {}, string, Vue.PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, Vue.ComponentProvideOptions, true, {}, any>;
|