@tanstack/vue-router 0.0.1 → 1.140.0

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.
Files changed (268) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -45
  3. package/dist/esm/Asset.d.ts +2 -0
  4. package/dist/esm/Asset.js +33 -0
  5. package/dist/esm/Asset.js.map +1 -0
  6. package/dist/esm/CatchBoundary.d.ts +19 -0
  7. package/dist/esm/CatchBoundary.js +135 -0
  8. package/dist/esm/CatchBoundary.js.map +1 -0
  9. package/dist/esm/ClientOnly.d.ts +67 -0
  10. package/dist/esm/HeadContent.d.ts +10 -0
  11. package/dist/esm/HeadContent.js +116 -0
  12. package/dist/esm/HeadContent.js.map +1 -0
  13. package/dist/esm/Match.d.ts +25 -0
  14. package/dist/esm/Match.js +262 -0
  15. package/dist/esm/Match.js.map +1 -0
  16. package/dist/esm/Matches.d.ts +39 -0
  17. package/dist/esm/Matches.js +186 -0
  18. package/dist/esm/Matches.js.map +1 -0
  19. package/dist/esm/RouterProvider.d.ts +33 -0
  20. package/dist/esm/RouterProvider.js +65 -0
  21. package/dist/esm/RouterProvider.js.map +1 -0
  22. package/dist/esm/SafeFragment.d.ts +4 -0
  23. package/dist/esm/ScriptOnce.d.ts +5 -0
  24. package/dist/esm/ScriptOnce.js +21 -0
  25. package/dist/esm/ScriptOnce.js.map +1 -0
  26. package/dist/esm/Scripts.d.ts +1 -0
  27. package/dist/esm/Scripts.js +46 -0
  28. package/dist/esm/Scripts.js.map +1 -0
  29. package/dist/esm/ScrollRestoration.d.ts +14 -0
  30. package/dist/esm/ScrollRestoration.js +36 -0
  31. package/dist/esm/ScrollRestoration.js.map +1 -0
  32. package/dist/esm/Transitioner.d.ts +2 -0
  33. package/dist/esm/Transitioner.js +154 -0
  34. package/dist/esm/Transitioner.js.map +1 -0
  35. package/dist/esm/awaited.d.ts +12 -0
  36. package/dist/esm/awaited.js +40 -0
  37. package/dist/esm/awaited.js.map +1 -0
  38. package/dist/esm/fileRoute.d.ts +54 -0
  39. package/dist/esm/fileRoute.js +103 -0
  40. package/dist/esm/fileRoute.js.map +1 -0
  41. package/dist/esm/history.d.ts +8 -0
  42. package/dist/esm/index.d.ts +51 -0
  43. package/dist/esm/index.js +138 -0
  44. package/dist/esm/index.js.map +1 -0
  45. package/dist/esm/lazyRouteComponent.d.ts +8 -0
  46. package/dist/esm/lazyRouteComponent.js +106 -0
  47. package/dist/esm/lazyRouteComponent.js.map +1 -0
  48. package/dist/esm/link.d.ts +61 -0
  49. package/dist/esm/link.js +376 -0
  50. package/dist/esm/link.js.map +1 -0
  51. package/dist/esm/matchContext.d.ts +20 -0
  52. package/dist/esm/matchContext.js +16 -0
  53. package/dist/esm/matchContext.js.map +1 -0
  54. package/dist/esm/not-found.d.ts +12 -0
  55. package/dist/esm/not-found.js +45 -0
  56. package/dist/esm/not-found.js.map +1 -0
  57. package/dist/esm/renderRouteNotFound.d.ts +11 -0
  58. package/dist/esm/renderRouteNotFound.js +19 -0
  59. package/dist/esm/renderRouteNotFound.js.map +1 -0
  60. package/dist/esm/route.d.ts +96 -0
  61. package/dist/esm/route.js +176 -0
  62. package/dist/esm/route.js.map +1 -0
  63. package/dist/esm/router.d.ts +69 -0
  64. package/dist/esm/router.js +14 -0
  65. package/dist/esm/router.js.map +1 -0
  66. package/dist/esm/routerContext.d.ts +21 -0
  67. package/dist/esm/routerContext.js +21 -0
  68. package/dist/esm/routerContext.js.map +1 -0
  69. package/dist/esm/scroll-restoration.d.ts +1 -0
  70. package/dist/esm/scroll-restoration.js +21 -0
  71. package/dist/esm/scroll-restoration.js.map +1 -0
  72. package/dist/esm/typePrimitives.d.ts +10 -0
  73. package/dist/esm/useBlocker.d.ts +66 -0
  74. package/dist/esm/useBlocker.js +295 -0
  75. package/dist/esm/useBlocker.js.map +1 -0
  76. package/dist/esm/useCanGoBack.d.ts +1 -0
  77. package/dist/esm/useCanGoBack.js +8 -0
  78. package/dist/esm/useCanGoBack.js.map +1 -0
  79. package/dist/esm/useLoaderData.d.ts +8 -0
  80. package/dist/esm/useLoaderData.js +14 -0
  81. package/dist/esm/useLoaderData.js.map +1 -0
  82. package/dist/esm/useLoaderDeps.d.ts +7 -0
  83. package/dist/esm/useLoaderDeps.js +17 -0
  84. package/dist/esm/useLoaderDeps.js.map +1 -0
  85. package/dist/esm/useLocation.d.ts +7 -0
  86. package/dist/esm/useLocation.js +10 -0
  87. package/dist/esm/useLocation.js.map +1 -0
  88. package/dist/esm/useMatch.d.ts +10 -0
  89. package/dist/esm/useMatch.js +39 -0
  90. package/dist/esm/useMatch.js.map +1 -0
  91. package/dist/esm/useNavigate.d.ts +5 -0
  92. package/dist/esm/useNavigate.js +29 -0
  93. package/dist/esm/useNavigate.js.map +1 -0
  94. package/dist/esm/useParams.d.ts +9 -0
  95. package/dist/esm/useParams.js +15 -0
  96. package/dist/esm/useParams.js.map +1 -0
  97. package/dist/esm/useRouteContext.d.ts +4 -0
  98. package/dist/esm/useRouteContext.js +11 -0
  99. package/dist/esm/useRouteContext.js.map +1 -0
  100. package/dist/esm/useRouter.d.ts +4 -0
  101. package/dist/esm/useRouter.js +12 -0
  102. package/dist/esm/useRouter.js.map +1 -0
  103. package/dist/esm/useRouterState.d.ts +8 -0
  104. package/dist/esm/useRouterState.js +20 -0
  105. package/dist/esm/useRouterState.js.map +1 -0
  106. package/dist/esm/useSearch.d.ts +9 -0
  107. package/dist/esm/useSearch.js +15 -0
  108. package/dist/esm/useSearch.js.map +1 -0
  109. package/dist/esm/utils.d.ts +40 -0
  110. package/dist/esm/utils.js +44 -0
  111. package/dist/esm/utils.js.map +1 -0
  112. package/dist/source/Asset.d.ts +2 -0
  113. package/dist/source/Asset.jsx +22 -0
  114. package/dist/source/Asset.jsx.map +1 -0
  115. package/dist/source/CatchBoundary.d.ts +19 -0
  116. package/dist/source/CatchBoundary.jsx +134 -0
  117. package/dist/source/CatchBoundary.jsx.map +1 -0
  118. package/dist/source/ClientOnly.d.ts +67 -0
  119. package/dist/source/ClientOnly.jsx +63 -0
  120. package/dist/source/ClientOnly.jsx.map +1 -0
  121. package/dist/source/HeadContent.d.ts +10 -0
  122. package/dist/source/HeadContent.jsx +133 -0
  123. package/dist/source/HeadContent.jsx.map +1 -0
  124. package/dist/source/Match.d.ts +25 -0
  125. package/dist/source/Match.jsx +316 -0
  126. package/dist/source/Match.jsx.map +1 -0
  127. package/dist/source/Matches.d.ts +39 -0
  128. package/dist/source/Matches.jsx +191 -0
  129. package/dist/source/Matches.jsx.map +1 -0
  130. package/dist/source/RouterProvider.d.ts +33 -0
  131. package/dist/source/RouterProvider.jsx +63 -0
  132. package/dist/source/RouterProvider.jsx.map +1 -0
  133. package/dist/source/SafeFragment.d.ts +4 -0
  134. package/dist/source/SafeFragment.jsx +10 -0
  135. package/dist/source/SafeFragment.jsx.map +1 -0
  136. package/dist/source/ScriptOnce.d.ts +5 -0
  137. package/dist/source/ScriptOnce.jsx +17 -0
  138. package/dist/source/ScriptOnce.jsx.map +1 -0
  139. package/dist/source/Scripts.d.ts +1 -0
  140. package/dist/source/Scripts.jsx +49 -0
  141. package/dist/source/Scripts.jsx.map +1 -0
  142. package/dist/source/ScrollRestoration.d.ts +14 -0
  143. package/dist/source/ScrollRestoration.jsx +37 -0
  144. package/dist/source/ScrollRestoration.jsx.map +1 -0
  145. package/dist/source/Transitioner.d.ts +2 -0
  146. package/dist/source/Transitioner.jsx +181 -0
  147. package/dist/source/Transitioner.jsx.map +1 -0
  148. package/dist/source/awaited.d.ts +12 -0
  149. package/dist/source/awaited.jsx +38 -0
  150. package/dist/source/awaited.jsx.map +1 -0
  151. package/dist/source/fileRoute.d.ts +54 -0
  152. package/dist/source/fileRoute.js +98 -0
  153. package/dist/source/fileRoute.js.map +1 -0
  154. package/dist/source/history.d.ts +8 -0
  155. package/dist/source/history.js +2 -0
  156. package/dist/source/history.js.map +1 -0
  157. package/dist/source/index.d.ts +51 -0
  158. package/dist/source/index.jsx +40 -0
  159. package/dist/source/index.jsx.map +1 -0
  160. package/dist/source/lazyRouteComponent.d.ts +8 -0
  161. package/dist/source/lazyRouteComponent.jsx +135 -0
  162. package/dist/source/lazyRouteComponent.jsx.map +1 -0
  163. package/dist/source/link.d.ts +61 -0
  164. package/dist/source/link.jsx +495 -0
  165. package/dist/source/link.jsx.map +1 -0
  166. package/dist/source/matchContext.d.ts +20 -0
  167. package/dist/source/matchContext.jsx +32 -0
  168. package/dist/source/matchContext.jsx.map +1 -0
  169. package/dist/source/not-found.d.ts +12 -0
  170. package/dist/source/not-found.jsx +48 -0
  171. package/dist/source/not-found.jsx.map +1 -0
  172. package/dist/source/renderRouteNotFound.d.ts +11 -0
  173. package/dist/source/renderRouteNotFound.jsx +24 -0
  174. package/dist/source/renderRouteNotFound.jsx.map +1 -0
  175. package/dist/source/route.d.ts +97 -0
  176. package/dist/source/route.js +167 -0
  177. package/dist/source/route.js.map +1 -0
  178. package/dist/source/router.d.ts +70 -0
  179. package/dist/source/router.js +10 -0
  180. package/dist/source/router.js.map +1 -0
  181. package/dist/source/routerContext.d.ts +21 -0
  182. package/dist/source/routerContext.jsx +37 -0
  183. package/dist/source/routerContext.jsx.map +1 -0
  184. package/dist/source/scroll-restoration.d.ts +1 -0
  185. package/dist/source/scroll-restoration.jsx +16 -0
  186. package/dist/source/scroll-restoration.jsx.map +1 -0
  187. package/dist/source/typePrimitives.d.ts +10 -0
  188. package/dist/source/typePrimitives.js +2 -0
  189. package/dist/source/typePrimitives.js.map +1 -0
  190. package/dist/source/useBlocker.d.ts +66 -0
  191. package/dist/source/useBlocker.jsx +308 -0
  192. package/dist/source/useBlocker.jsx.map +1 -0
  193. package/dist/source/useCanGoBack.d.ts +1 -0
  194. package/dist/source/useCanGoBack.js +5 -0
  195. package/dist/source/useCanGoBack.js.map +1 -0
  196. package/dist/source/useLoaderData.d.ts +8 -0
  197. package/dist/source/useLoaderData.jsx +11 -0
  198. package/dist/source/useLoaderData.jsx.map +1 -0
  199. package/dist/source/useLoaderDeps.d.ts +7 -0
  200. package/dist/source/useLoaderDeps.jsx +11 -0
  201. package/dist/source/useLoaderDeps.jsx.map +1 -0
  202. package/dist/source/useLocation.d.ts +7 -0
  203. package/dist/source/useLocation.jsx +7 -0
  204. package/dist/source/useLocation.jsx.map +1 -0
  205. package/dist/source/useMatch.d.ts +10 -0
  206. package/dist/source/useMatch.jsx +46 -0
  207. package/dist/source/useMatch.jsx.map +1 -0
  208. package/dist/source/useNavigate.d.ts +5 -0
  209. package/dist/source/useNavigate.jsx +18 -0
  210. package/dist/source/useNavigate.jsx.map +1 -0
  211. package/dist/source/useParams.d.ts +9 -0
  212. package/dist/source/useParams.jsx +12 -0
  213. package/dist/source/useParams.jsx.map +1 -0
  214. package/dist/source/useRouteContext.d.ts +4 -0
  215. package/dist/source/useRouteContext.js +8 -0
  216. package/dist/source/useRouteContext.js.map +1 -0
  217. package/dist/source/useRouter.d.ts +4 -0
  218. package/dist/source/useRouter.jsx +9 -0
  219. package/dist/source/useRouter.jsx.map +1 -0
  220. package/dist/source/useRouterState.d.ts +8 -0
  221. package/dist/source/useRouterState.jsx +19 -0
  222. package/dist/source/useRouterState.jsx.map +1 -0
  223. package/dist/source/useSearch.d.ts +9 -0
  224. package/dist/source/useSearch.jsx +12 -0
  225. package/dist/source/useSearch.jsx.map +1 -0
  226. package/dist/source/utils.d.ts +40 -0
  227. package/dist/source/utils.js +78 -0
  228. package/dist/source/utils.js.map +1 -0
  229. package/package.json +77 -7
  230. package/src/Asset.tsx +23 -0
  231. package/src/CatchBoundary.tsx +186 -0
  232. package/src/ClientOnly.tsx +75 -0
  233. package/src/HeadContent.tsx +159 -0
  234. package/src/Match.tsx +415 -0
  235. package/src/Matches.tsx +349 -0
  236. package/src/RouterProvider.tsx +117 -0
  237. package/src/SafeFragment.tsx +10 -0
  238. package/src/ScriptOnce.tsx +30 -0
  239. package/src/Scripts.tsx +65 -0
  240. package/src/ScrollRestoration.tsx +69 -0
  241. package/src/Transitioner.tsx +213 -0
  242. package/src/awaited.tsx +54 -0
  243. package/src/fileRoute.ts +271 -0
  244. package/src/history.ts +9 -0
  245. package/src/index.tsx +346 -0
  246. package/src/lazyRouteComponent.tsx +173 -0
  247. package/src/link.tsx +765 -0
  248. package/src/matchContext.tsx +41 -0
  249. package/src/not-found.tsx +55 -0
  250. package/src/renderRouteNotFound.tsx +35 -0
  251. package/src/route.ts +658 -0
  252. package/src/router.ts +103 -0
  253. package/src/routerContext.tsx +53 -0
  254. package/src/scroll-restoration.tsx +29 -0
  255. package/src/typePrimitives.ts +74 -0
  256. package/src/useBlocker.tsx +501 -0
  257. package/src/useCanGoBack.ts +5 -0
  258. package/src/useLoaderData.tsx +50 -0
  259. package/src/useLoaderDeps.tsx +46 -0
  260. package/src/useLocation.tsx +30 -0
  261. package/src/useMatch.tsx +127 -0
  262. package/src/useNavigate.tsx +40 -0
  263. package/src/useParams.tsx +71 -0
  264. package/src/useRouteContext.ts +31 -0
  265. package/src/useRouter.tsx +15 -0
  266. package/src/useRouterState.tsx +43 -0
  267. package/src/useSearch.tsx +71 -0
  268. 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
- # @tanstack/vue-router
2
-
3
- ## ⚠️ IMPORTANT NOTICE ⚠️
4
-
5
- **This package is created solely for the purpose of setting up OIDC (OpenID Connect) trusted publishing with npm.**
6
-
7
- This is **NOT** a functional package and contains **NO** code or functionality beyond the OIDC setup configuration.
8
-
9
- ## Purpose
10
-
11
- This package exists to:
12
- 1. Configure OIDC trusted publishing for the package name `@tanstack/vue-router`
13
- 2. Enable secure, token-less publishing from CI/CD workflows
14
- 3. Establish provenance for packages published under this name
15
-
16
- ## What is OIDC Trusted Publishing?
17
-
18
- OIDC trusted publishing allows package maintainers to publish packages directly from their CI/CD workflows without needing to manage npm access tokens. Instead, it uses OpenID Connect to establish trust between the CI/CD provider (like GitHub Actions) and npm.
19
-
20
- ## Setup Instructions
21
-
22
- To properly configure OIDC trusted publishing for this package:
23
-
24
- 1. Go to [npmjs.com](https://www.npmjs.com/) and navigate to your package settings
25
- 2. Configure the trusted publisher (e.g., GitHub Actions)
26
- 3. Specify the repository and workflow that should be allowed to publish
27
- 4. Use the configured workflow to publish your actual package
28
-
29
- ## DO NOT USE THIS PACKAGE
30
-
31
- This package is a placeholder for OIDC configuration only. It:
32
- - Contains no executable code
33
- - Provides no functionality
34
- - Should not be installed as a dependency
35
- - Exists only for administrative purposes
36
-
37
- ## More Information
38
-
39
- For more details about npm's trusted publishing feature, see:
40
- - [npm Trusted Publishing Documentation](https://docs.npmjs.com/generating-provenance-statements)
41
- - [GitHub Actions OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
42
-
43
- ---
44
-
45
- **Maintained for OIDC setup purposes only**
1
+ <img src="https://static.scarf.sh/a.png?x-pxid=d988eb79-b0fc-4a2b-8514-6a1ab932d188" />
2
+
3
+ # TanStack Solid Router
4
+
5
+ ![TanStack Router Header](https://github.com/tanstack/router/raw/main/media/header.png)
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,2 @@
1
+ import { RouterManagedTag } from '@tanstack/router-core';
2
+ export declare function Asset({ tag, attrs, children }: RouterManagedTag): any;
@@ -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":"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"}
@@ -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>;