vitepress 2.0.0-alpha.2 → 2.0.0-alpha.21

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 (286) hide show
  1. package/README.md +34 -2
  2. package/THIRD-PARTY-NOTICES.md +1736 -0
  3. package/bin/vitepress.js +14 -0
  4. package/client.d.ts +9 -0
  5. package/dist/client/app/components/ClientOnly.d.ts +5 -0
  6. package/dist/client/app/components/ClientOnly.js +11 -10
  7. package/dist/client/app/components/Content.d.ts +17 -0
  8. package/dist/client/app/components/Content.js +25 -22
  9. package/dist/client/app/composables/codeGroups.d.ts +3 -0
  10. package/dist/client/app/composables/codeGroups.js +36 -39
  11. package/dist/client/app/composables/copyCode.d.ts +3 -0
  12. package/dist/client/app/composables/copyCode.js +59 -70
  13. package/dist/client/app/composables/head.d.ts +5 -0
  14. package/dist/client/app/composables/head.js +56 -74
  15. package/dist/client/app/composables/icon.d.ts +12 -0
  16. package/dist/client/app/composables/icon.js +56 -0
  17. package/dist/client/app/composables/preFetch.d.ts +3 -0
  18. package/dist/client/app/composables/preFetch.js +64 -96
  19. package/dist/client/app/data.d.ts +9 -0
  20. package/dist/client/app/data.js +34 -59
  21. package/dist/client/app/devtools.d.ts +7 -0
  22. package/dist/client/app/devtools.js +29 -28
  23. package/dist/client/app/index.d.ts +11 -0
  24. package/dist/client/app/index.js +106 -131
  25. package/dist/client/app/router.d.ts +49 -0
  26. package/dist/client/app/router.js +198 -239
  27. package/dist/client/app/ssr.d.ts +4 -0
  28. package/dist/client/app/ssr.js +14 -9
  29. package/dist/client/app/theme.d.ts +24 -0
  30. package/dist/client/app/theme.js +0 -1
  31. package/dist/client/app/utils.d.ts +35 -0
  32. package/dist/client/app/utils.js +77 -110
  33. package/dist/client/index.d.ts +21 -137
  34. package/dist/client/index.js +8 -9
  35. package/dist/client/shared.d.ts +88 -0
  36. package/dist/client/shared.js +265 -141
  37. package/dist/client/theme-default/Layout.d.vue.ts +79 -0
  38. package/dist/client/theme-default/Layout.vue +33 -36
  39. package/dist/client/theme-default/NotFound.d.vue.ts +3 -0
  40. package/dist/client/theme-default/NotFound.vue +33 -35
  41. package/dist/client/theme-default/components/VPAlgoliaSearchBox.d.vue.ts +11 -0
  42. package/dist/client/theme-default/components/VPAlgoliaSearchBox.vue +202 -70
  43. package/dist/client/theme-default/components/VPBackdrop.d.vue.ts +6 -0
  44. package/dist/client/theme-default/components/VPBackdrop.vue +8 -12
  45. package/dist/client/theme-default/components/VPBadge.d.vue.ts +19 -0
  46. package/dist/client/theme-default/components/VPBadge.vue +49 -26
  47. package/dist/client/theme-default/components/VPButton.d.vue.ts +25 -0
  48. package/dist/client/theme-default/components/VPButton.vue +53 -36
  49. package/dist/client/theme-default/components/VPCarbonAds.d.vue.ts +7 -0
  50. package/dist/client/theme-default/components/VPCarbonAds.vue +51 -52
  51. package/dist/client/theme-default/components/VPContent.d.vue.ts +59 -0
  52. package/dist/client/theme-default/components/VPContent.vue +27 -26
  53. package/dist/client/theme-default/components/VPDoc.d.vue.ts +33 -0
  54. package/dist/client/theme-default/components/VPDoc.vue +52 -48
  55. package/dist/client/theme-default/components/VPDocAside.d.vue.ts +23 -0
  56. package/dist/client/theme-default/components/VPDocAside.vue +7 -8
  57. package/dist/client/theme-default/components/VPDocAsideCarbonAds.d.vue.ts +7 -0
  58. package/dist/client/theme-default/components/VPDocAsideCarbonAds.vue +7 -11
  59. package/dist/client/theme-default/components/VPDocAsideOutline.d.vue.ts +3 -0
  60. package/dist/client/theme-default/components/VPDocAsideOutline.vue +22 -38
  61. package/dist/client/theme-default/components/VPDocAsideSponsors.d.vue.ts +10 -0
  62. package/dist/client/theme-default/components/VPDocAsideSponsors.vue +17 -11
  63. package/dist/client/theme-default/components/VPDocFooter.d.vue.ts +13 -0
  64. package/dist/client/theme-default/components/VPDocFooter.vue +38 -45
  65. package/dist/client/theme-default/components/VPDocFooterLastUpdated.d.vue.ts +3 -0
  66. package/dist/client/theme-default/components/VPDocFooterLastUpdated.vue +30 -29
  67. package/dist/client/theme-default/components/VPDocOutlineItem.d.vue.ts +8 -0
  68. package/dist/client/theme-default/components/VPDocOutlineItem.vue +20 -19
  69. package/dist/client/theme-default/components/VPFeature.d.vue.ts +13 -0
  70. package/dist/client/theme-default/components/VPFeature.vue +62 -36
  71. package/dist/client/theme-default/components/VPFeatures.d.vue.ts +16 -0
  72. package/dist/client/theme-default/components/VPFeatures.vue +35 -48
  73. package/dist/client/theme-default/components/VPFlyout.d.vue.ts +26 -0
  74. package/dist/client/theme-default/components/VPFlyout.vue +111 -47
  75. package/dist/client/theme-default/components/VPFooter.d.vue.ts +3 -0
  76. package/dist/client/theme-default/components/VPFooter.vue +22 -15
  77. package/dist/client/theme-default/components/VPHero.d.vue.ts +38 -0
  78. package/dist/client/theme-default/components/VPHero.vue +109 -99
  79. package/dist/client/theme-default/components/VPHome.d.vue.ts +31 -0
  80. package/dist/client/theme-default/components/VPHome.vue +15 -15
  81. package/dist/client/theme-default/components/VPHomeContent.d.vue.ts +13 -0
  82. package/dist/client/theme-default/components/VPHomeContent.vue +9 -27
  83. package/dist/client/theme-default/components/VPHomeFeatures.d.vue.ts +3 -0
  84. package/dist/client/theme-default/components/VPHomeFeatures.vue +4 -5
  85. package/dist/client/theme-default/components/VPHomeHero.d.vue.ts +23 -0
  86. package/dist/client/theme-default/components/VPHomeHero.vue +5 -5
  87. package/dist/client/theme-default/components/VPHomeSponsors.d.vue.ts +21 -0
  88. package/dist/client/theme-default/components/VPHomeSponsors.vue +42 -43
  89. package/dist/client/theme-default/components/VPIcon.d.vue.ts +8 -0
  90. package/dist/client/theme-default/components/VPIcon.vue +29 -0
  91. package/dist/client/theme-default/components/VPImage.d.vue.ts +8 -0
  92. package/dist/client/theme-default/components/VPImage.vue +20 -14
  93. package/dist/client/theme-default/components/VPLink.d.vue.ts +23 -0
  94. package/dist/client/theme-default/components/VPLink.vue +42 -23
  95. package/dist/client/theme-default/components/VPLocalNav.d.vue.ts +10 -0
  96. package/dist/client/theme-default/components/VPLocalNav.vue +69 -86
  97. package/dist/client/theme-default/components/VPLocalNavOutlineDropdown.d.vue.ts +8 -0
  98. package/dist/client/theme-default/components/VPLocalNavOutlineDropdown.vue +98 -96
  99. package/dist/client/theme-default/components/VPLocalSearchBox.d.vue.ts +7 -0
  100. package/dist/client/theme-default/components/VPLocalSearchBox.vue +391 -454
  101. package/dist/client/theme-default/components/VPMenu.d.vue.ts +23 -0
  102. package/dist/client/theme-default/components/VPMenu.vue +19 -31
  103. package/dist/client/theme-default/components/VPMenuGroup.d.vue.ts +22 -0
  104. package/dist/client/theme-default/components/VPMenuGroup.vue +72 -18
  105. package/dist/client/theme-default/components/VPMenuLink.d.vue.ts +22 -0
  106. package/dist/client/theme-default/components/VPMenuLink.vue +65 -31
  107. package/dist/client/theme-default/components/VPNav.d.vue.ts +23 -0
  108. package/dist/client/theme-default/components/VPNav.vue +18 -24
  109. package/dist/client/theme-default/components/VPNavAppearance.d.vue.ts +9 -0
  110. package/dist/client/theme-default/components/VPNavAppearance.vue +88 -0
  111. package/dist/client/theme-default/components/VPNavBar.d.vue.ts +26 -0
  112. package/dist/client/theme-default/components/VPNavBar.vue +170 -142
  113. package/dist/client/theme-default/components/VPNavBarAskAiButton.d.vue.ts +3 -0
  114. package/dist/client/theme-default/components/VPNavBarAskAiButton.vue +31 -0
  115. package/dist/client/theme-default/components/VPNavBarExtra.d.vue.ts +3 -0
  116. package/dist/client/theme-default/components/VPNavBarExtra.vue +51 -73
  117. package/dist/client/theme-default/components/VPNavBarHamburger.d.vue.ts +10 -0
  118. package/dist/client/theme-default/components/VPNavBarHamburger.vue +38 -28
  119. package/dist/client/theme-default/components/VPNavBarSearch.d.vue.ts +3 -0
  120. package/dist/client/theme-default/components/VPNavBarSearch.vue +129 -160
  121. package/dist/client/theme-default/components/VPNavBarSearchButton.d.vue.ts +6 -0
  122. package/dist/client/theme-default/components/VPNavBarSearchButton.vue +48 -182
  123. package/dist/client/theme-default/components/VPNavBarTitle.d.vue.ts +15 -0
  124. package/dist/client/theme-default/components/VPNavBarTitle.vue +39 -38
  125. package/dist/client/theme-default/components/VPNavMenu.d.vue.ts +6 -0
  126. package/dist/client/theme-default/components/VPNavMenu.vue +76 -0
  127. package/dist/client/theme-default/components/VPNavMenuGroup.d.vue.ts +11 -0
  128. package/dist/client/theme-default/components/VPNavMenuGroup.vue +140 -0
  129. package/dist/client/theme-default/components/VPNavMenuLink.d.vue.ts +8 -0
  130. package/dist/client/theme-default/components/VPNavMenuLink.vue +69 -0
  131. package/dist/client/theme-default/components/VPNavScreen.d.vue.ts +18 -0
  132. package/dist/client/theme-default/components/VPNavScreen.vue +36 -34
  133. package/dist/client/theme-default/components/VPNavSocialLinks.d.vue.ts +6 -0
  134. package/dist/client/theme-default/components/VPNavSocialLinks.vue +36 -0
  135. package/dist/client/theme-default/components/VPNavTranslations.d.vue.ts +9 -0
  136. package/dist/client/theme-default/components/VPNavTranslations.vue +170 -0
  137. package/dist/client/theme-default/components/VPPage.d.vue.ts +15 -0
  138. package/dist/client/theme-default/components/VPSidebar.d.vue.ts +18 -0
  139. package/dist/client/theme-default/components/VPSidebar.vue +40 -53
  140. package/dist/client/theme-default/components/VPSidebarGroup.d.vue.ts +7 -0
  141. package/dist/client/theme-default/components/VPSidebarGroup.vue +24 -29
  142. package/dist/client/theme-default/components/VPSidebarItem.d.vue.ts +8 -0
  143. package/dist/client/theme-default/components/VPSidebarItem.vue +60 -93
  144. package/dist/client/theme-default/components/VPSkipLink.d.vue.ts +6 -0
  145. package/dist/client/theme-default/components/VPSkipLink.vue +23 -42
  146. package/dist/client/theme-default/components/VPSocialLink.d.vue.ts +11 -0
  147. package/dist/client/theme-default/components/VPSocialLink.vue +42 -49
  148. package/dist/client/theme-default/components/VPSocialLinks.d.vue.ts +10 -0
  149. package/dist/client/theme-default/components/VPSocialLinks.vue +26 -16
  150. package/dist/client/theme-default/components/VPSponsors.d.vue.ts +18 -0
  151. package/dist/client/theme-default/components/VPSponsors.vue +34 -33
  152. package/dist/client/theme-default/components/VPSponsorsGrid.d.vue.ts +15 -0
  153. package/dist/client/theme-default/components/VPSponsorsGrid.vue +23 -26
  154. package/dist/client/theme-default/components/VPSwitch.d.vue.ts +13 -0
  155. package/dist/client/theme-default/components/VPSwitch.vue +12 -13
  156. package/dist/client/theme-default/components/VPSwitchAppearance.d.vue.ts +3 -0
  157. package/dist/client/theme-default/components/VPSwitchAppearance.vue +16 -21
  158. package/dist/client/theme-default/components/VPTeamMembers.d.vue.ts +10 -0
  159. package/dist/client/theme-default/components/VPTeamMembers.vue +59 -32
  160. package/dist/client/theme-default/components/VPTeamMembersItem.d.vue.ts +10 -0
  161. package/dist/client/theme-default/components/VPTeamMembersItem.vue +62 -58
  162. package/dist/client/theme-default/components/VPTeamPage.d.vue.ts +13 -0
  163. package/dist/client/theme-default/components/VPTeamPage.vue +14 -14
  164. package/dist/client/theme-default/components/VPTeamPageSection.d.vue.ts +17 -0
  165. package/dist/client/theme-default/components/VPTeamPageSection.vue +20 -19
  166. package/dist/client/theme-default/components/VPTeamPageTitle.d.vue.ts +15 -0
  167. package/dist/client/theme-default/components/VPTeamPageTitle.vue +22 -22
  168. package/dist/client/theme-default/composables/data.d.ts +5 -0
  169. package/dist/client/theme-default/composables/data.js +5 -2
  170. package/dist/client/theme-default/composables/edit-link.d.ts +6 -0
  171. package/dist/client/theme-default/composables/edit-link.js +17 -15
  172. package/dist/client/theme-default/composables/flyout.d.ts +10 -0
  173. package/dist/client/theme-default/composables/flyout.js +33 -32
  174. package/dist/client/theme-default/composables/langs.d.ts +44 -0
  175. package/dist/client/theme-default/composables/langs.js +48 -24
  176. package/dist/client/theme-default/composables/layout.d.ts +13 -0
  177. package/dist/client/theme-default/composables/layout.js +68 -0
  178. package/dist/client/theme-default/composables/nav-overflow.d.ts +54 -0
  179. package/dist/client/theme-default/composables/nav-overflow.js +179 -0
  180. package/dist/client/theme-default/composables/nav.d.ts +25 -0
  181. package/dist/client/theme-default/composables/nav.js +58 -29
  182. package/dist/client/theme-default/composables/outline.d.ts +8 -0
  183. package/dist/client/theme-default/composables/outline.js +144 -166
  184. package/dist/client/theme-default/composables/prev-next.d.ts +16 -0
  185. package/dist/client/theme-default/composables/prev-next.js +34 -56
  186. package/dist/client/theme-default/composables/scroll-lock.d.ts +4 -0
  187. package/dist/client/theme-default/composables/scroll-lock.js +95 -0
  188. package/dist/client/theme-default/composables/sidebar.d.ts +25 -0
  189. package/dist/client/theme-default/composables/sidebar.js +96 -133
  190. package/dist/client/theme-default/composables/sponsor-grid.d.ts +10 -0
  191. package/dist/client/theme-default/composables/sponsor-grid.js +69 -76
  192. package/dist/client/theme-default/fonts/inter-italic-cyrillic-ext.woff2 +0 -0
  193. package/dist/client/theme-default/fonts/inter-italic-cyrillic.woff2 +0 -0
  194. package/dist/client/theme-default/fonts/inter-italic-greek-ext.woff2 +0 -0
  195. package/dist/client/theme-default/fonts/inter-italic-greek.woff2 +0 -0
  196. package/dist/client/theme-default/fonts/inter-italic-latin-ext.woff2 +0 -0
  197. package/dist/client/theme-default/fonts/inter-italic-latin.woff2 +0 -0
  198. package/dist/client/theme-default/fonts/inter-italic-symbols.woff2 +0 -0
  199. package/dist/client/theme-default/fonts/inter-italic-vietnamese.woff2 +0 -0
  200. package/dist/client/theme-default/fonts/inter-roman-cyrillic-ext.woff2 +0 -0
  201. package/dist/client/theme-default/fonts/inter-roman-cyrillic.woff2 +0 -0
  202. package/dist/client/theme-default/fonts/inter-roman-greek-ext.woff2 +0 -0
  203. package/dist/client/theme-default/fonts/inter-roman-greek.woff2 +0 -0
  204. package/dist/client/theme-default/fonts/inter-roman-latin-ext.woff2 +0 -0
  205. package/dist/client/theme-default/fonts/inter-roman-latin.woff2 +0 -0
  206. package/dist/client/theme-default/fonts/inter-roman-symbols.woff2 +0 -0
  207. package/dist/client/theme-default/fonts/inter-roman-vietnamese.woff2 +0 -0
  208. package/dist/client/theme-default/index.d.ts +3 -0
  209. package/dist/client/theme-default/index.js +4 -3
  210. package/dist/client/theme-default/styles/base.css +279 -211
  211. package/dist/client/theme-default/styles/components/custom-block.css +12 -7
  212. package/dist/client/theme-default/styles/components/vp-code-group.css +13 -16
  213. package/dist/client/theme-default/styles/components/vp-code.css +10 -2
  214. package/dist/client/theme-default/styles/components/vp-doc.css +188 -142
  215. package/dist/client/theme-default/styles/components/vp-sponsor.css +48 -37
  216. package/dist/client/theme-default/styles/docsearch.css +138 -0
  217. package/dist/client/theme-default/styles/fonts.css +216 -55
  218. package/dist/client/theme-default/styles/icons.css +42 -22
  219. package/dist/client/theme-default/styles/vars.css +111 -46
  220. package/dist/client/theme-default/support/docsearch.d.ts +57 -0
  221. package/dist/client/theme-default/support/docsearch.js +145 -0
  222. package/dist/client/theme-default/support/local-search.d.ts +9 -0
  223. package/dist/client/theme-default/support/local-search.js +31 -0
  224. package/dist/client/theme-default/support/lru.d.ts +11 -0
  225. package/dist/client/theme-default/support/lru.js +30 -33
  226. package/dist/client/theme-default/support/reactivity.d.ts +4 -0
  227. package/dist/client/theme-default/support/reactivity.js +10 -0
  228. package/dist/client/theme-default/support/sidebar.d.ts +27 -0
  229. package/dist/client/theme-default/support/sidebar.js +69 -80
  230. package/dist/client/theme-default/support/translation.d.ts +6 -0
  231. package/dist/client/theme-default/support/translation.js +33 -47
  232. package/dist/client/theme-default/support/utils.d.ts +7 -0
  233. package/dist/client/theme-default/support/utils.js +39 -30
  234. package/dist/client/theme-default/without-fonts.d.ts +25 -0
  235. package/dist/client/theme-default/without-fonts.js +37 -36
  236. package/dist/node/chunk-BjrVv9r8.js +28627 -0
  237. package/dist/node/cli.d.ts +1 -0
  238. package/dist/node/cli.js +160 -423
  239. package/dist/node/index.d.ts +1761 -2476
  240. package/dist/node/index.js +1 -121
  241. package/dist/web-types.json +75 -0
  242. package/package.json +89 -98
  243. package/template/.vitepress/config.js +3 -1
  244. package/template/.vitepress/theme/style.css +3 -11
  245. package/theme.d.ts +30 -23
  246. package/types/default-theme.d.ts +109 -113
  247. package/types/docsearch.d.ts +61 -142
  248. package/types/shared.d.ts +469 -50
  249. package/dist/client/theme-default/components/VPNavBarAppearance.vue +0 -32
  250. package/dist/client/theme-default/components/VPNavBarMenu.vue +0 -40
  251. package/dist/client/theme-default/components/VPNavBarMenuGroup.vue +0 -42
  252. package/dist/client/theme-default/components/VPNavBarMenuLink.vue +0 -53
  253. package/dist/client/theme-default/components/VPNavBarSocialLinks.vue +0 -27
  254. package/dist/client/theme-default/components/VPNavBarTranslations.vue +0 -47
  255. package/dist/client/theme-default/components/VPNavScreenAppearance.vue +0 -40
  256. package/dist/client/theme-default/components/VPNavScreenMenu.vue +0 -26
  257. package/dist/client/theme-default/components/VPNavScreenMenuGroup.vue +0 -112
  258. package/dist/client/theme-default/components/VPNavScreenMenuGroupLink.vue +0 -40
  259. package/dist/client/theme-default/components/VPNavScreenMenuGroupSection.vue +0 -34
  260. package/dist/client/theme-default/components/VPNavScreenMenuLink.vue +0 -43
  261. package/dist/client/theme-default/components/VPNavScreenSocialLinks.vue +0 -14
  262. package/dist/client/theme-default/components/VPNavScreenTranslations.vue +0 -73
  263. package/dist/client/theme-default/components/icons/VPIconAlignJustify.vue +0 -8
  264. package/dist/client/theme-default/components/icons/VPIconAlignLeft.vue +0 -8
  265. package/dist/client/theme-default/components/icons/VPIconAlignRight.vue +0 -8
  266. package/dist/client/theme-default/components/icons/VPIconArrowLeft.vue +0 -7
  267. package/dist/client/theme-default/components/icons/VPIconArrowRight.vue +0 -7
  268. package/dist/client/theme-default/components/icons/VPIconChevronDown.vue +0 -5
  269. package/dist/client/theme-default/components/icons/VPIconChevronLeft.vue +0 -5
  270. package/dist/client/theme-default/components/icons/VPIconChevronRight.vue +0 -5
  271. package/dist/client/theme-default/components/icons/VPIconChevronUp.vue +0 -5
  272. package/dist/client/theme-default/components/icons/VPIconEdit.vue +0 -6
  273. package/dist/client/theme-default/components/icons/VPIconHeart.vue +0 -5
  274. package/dist/client/theme-default/components/icons/VPIconLanguages.vue +0 -9
  275. package/dist/client/theme-default/components/icons/VPIconMinus.vue +0 -5
  276. package/dist/client/theme-default/components/icons/VPIconMinusSquare.vue +0 -6
  277. package/dist/client/theme-default/components/icons/VPIconMoon.vue +0 -5
  278. package/dist/client/theme-default/components/icons/VPIconMoreHorizontal.vue +0 -7
  279. package/dist/client/theme-default/components/icons/VPIconPlus.vue +0 -5
  280. package/dist/client/theme-default/components/icons/VPIconPlusSquare.vue +0 -6
  281. package/dist/client/theme-default/components/icons/VPIconSun.vue +0 -13
  282. package/dist/client/theme-default/composables/aside.js +0 -17
  283. package/dist/client/theme-default/composables/local-nav.js +0 -18
  284. package/dist/node/chunk-C-d2RJOW.js +0 -470
  285. package/dist/node/chunk-CxQfvv8o.js +0 -49065
  286. package/dist/node/worker_shikiResolveLang.js +0 -13
@@ -1,99 +1,67 @@
1
- // Customized pre-fetch for page chunks based on
2
- // https://github.com/GoogleChromeLabs/quicklink
3
- import { onMounted, onUnmounted, watch } from 'vue';
4
- import { useRoute } from '../router';
5
- import { inBrowser, pathToFile } from '../utils';
6
- const hasFetched = new Set();
7
- const createLink = () => document.createElement('link');
8
- const viaDOM = (url) => {
9
- const link = createLink();
10
- link.rel = `prefetch`;
11
- link.href = url;
12
- document.head.appendChild(link);
1
+ import { EXTERNAL_URL_RE, inBrowser } from "../../shared.js";
2
+ import { pathToFile } from "../utils.js";
3
+ import { getRoutableLinkUrl, useRoute } from "../router.js";
4
+ import { computed, onMounted, onUnmounted, watch } from "vue";
5
+ import { useNetwork } from "@vueuse/core";
6
+ //#region src/client/app/composables/preFetch.ts
7
+ const hasFetched = /* @__PURE__ */ new Set();
8
+ const createLink = () => document.createElement("link");
9
+ const viaDOM = (url, onError) => {
10
+ const link = createLink();
11
+ link.rel = `prefetch`;
12
+ if (EXTERNAL_URL_RE.test(url)) link.crossOrigin = "";
13
+ link.href = url;
14
+ link.onerror = () => {
15
+ link.remove();
16
+ onError();
17
+ };
18
+ document.head.appendChild(link);
13
19
  };
14
- const viaXHR = (url) => {
15
- const req = new XMLHttpRequest();
16
- req.open('GET', url, (req.withCredentials = true));
17
- req.send();
20
+ const viaXHR = (url, onError) => {
21
+ const req = new XMLHttpRequest();
22
+ req.open("GET", url, true);
23
+ req.withCredentials = !EXTERNAL_URL_RE.test(url);
24
+ req.onerror = onError;
25
+ req.send();
18
26
  };
19
- let link;
20
- const doFetch = inBrowser &&
21
- (link = createLink()) &&
22
- link.relList &&
23
- link.relList.supports &&
24
- link.relList.supports('prefetch')
25
- ? viaDOM
26
- : viaXHR;
27
- export function usePrefetch() {
28
- if (!inBrowser) {
29
- return;
30
- }
31
- if (!window.IntersectionObserver) {
32
- return;
33
- }
34
- let conn;
35
- if ((conn = navigator.connection) &&
36
- (conn.saveData || /2g/.test(conn.effectiveType))) {
37
- // Don't prefetch if using 2G or if Save-Data is enabled.
38
- return;
39
- }
40
- const rIC = window.requestIdleCallback || setTimeout;
41
- let observer = null;
42
- const observeLinks = () => {
43
- if (observer) {
44
- observer.disconnect();
45
- }
46
- observer = new IntersectionObserver((entries) => {
47
- entries.forEach((entry) => {
48
- if (entry.isIntersecting) {
49
- const link = entry.target;
50
- observer.unobserve(link);
51
- const { pathname } = link;
52
- if (!hasFetched.has(pathname)) {
53
- hasFetched.add(pathname);
54
- const pageChunkPath = pathToFile(pathname);
55
- if (pageChunkPath)
56
- doFetch(pageChunkPath);
57
- }
58
- }
59
- });
60
- });
61
- rIC(() => {
62
- document
63
- .querySelectorAll('#app a')
64
- .forEach((link) => {
65
- const { hostname, pathname } = new URL(link.href instanceof SVGAnimatedString
66
- ? link.href.animVal
67
- : link.href, link.baseURI);
68
- const extMatch = pathname.match(/\.\w+$/);
69
- if (extMatch && extMatch[0] !== '.html') {
70
- return;
71
- }
72
- if (
73
- // only prefetch same tab navigation, since a new tab will load
74
- // the lean js chunk instead.
75
- link.target !== '_blank' &&
76
- // only prefetch inbound links
77
- hostname === location.hostname) {
78
- if (pathname !== location.pathname) {
79
- observer.observe(link);
80
- }
81
- else {
82
- // No need to prefetch chunk for the current page, but also mark
83
- // it as already fetched. This is because the initial page uses its
84
- // lean chunk, and if we don't mark it, navigation to another page
85
- // with a link back to the first page will fetch its full chunk
86
- // which isn't needed.
87
- hasFetched.add(pathname);
88
- }
89
- }
90
- });
91
- });
92
- };
93
- onMounted(observeLinks);
94
- const route = useRoute();
95
- watch(() => route.path, observeLinks);
96
- onUnmounted(() => {
97
- observer && observer.disconnect();
98
- });
27
+ function usePrefetch() {
28
+ if (!inBrowser) return;
29
+ const { isOnline, saveData, effectiveType } = useNetwork();
30
+ const isWeak = computed(() => !isOnline.value || saveData.value || !!effectiveType.value?.includes("2g"));
31
+ const prefetch = createLink().relList.supports("prefetch") ? viaDOM : viaXHR;
32
+ const rIC = window.requestIdleCallback || setTimeout;
33
+ let observer = null;
34
+ const observeLinks = () => {
35
+ if (observer) observer.disconnect();
36
+ observer = new IntersectionObserver((entries) => {
37
+ entries.forEach((entry) => {
38
+ if (!entry.isIntersecting || isWeak.value) return;
39
+ const link = entry.target;
40
+ observer.unobserve(link);
41
+ const url = getRoutableLinkUrl(link);
42
+ const pageChunkPath = url && pathToFile(url.pathname);
43
+ if (!pageChunkPath || hasFetched.has(pageChunkPath)) return;
44
+ hasFetched.add(pageChunkPath);
45
+ prefetch(pageChunkPath, () => hasFetched.delete(pageChunkPath));
46
+ });
47
+ });
48
+ rIC(() => {
49
+ document.querySelectorAll("#app a").forEach((link) => {
50
+ const url = getRoutableLinkUrl(link);
51
+ if (url && url.pathname !== location.pathname) observer.observe(link);
52
+ });
53
+ });
54
+ };
55
+ onMounted(observeLinks);
56
+ const route = useRoute();
57
+ watch(() => route.path, () => {
58
+ const pageChunkPath = pathToFile(location.pathname);
59
+ if (pageChunkPath) hasFetched.add(pageChunkPath);
60
+ observeLinks();
61
+ });
62
+ onUnmounted(() => {
63
+ observer?.disconnect();
64
+ });
99
65
  }
66
+ //#endregion
67
+ export { usePrefetch };
@@ -0,0 +1,9 @@
1
+ import { Route, SiteData, VitePressData } from "../shared.js";
2
+ import { InjectionKey, Ref } from "vue";
3
+ //#region src/client/app/data.d.ts
4
+ export declare const dataSymbol: InjectionKey<VitePressData>;
5
+ export declare const siteDataRef: Ref<SiteData>;
6
+ export declare function initData(route: Route): VitePressData;
7
+ export declare function useData<T = any>(): VitePressData<T>;
8
+ //#endregion
9
+ export type { VitePressData };
@@ -1,61 +1,36 @@
1
- import siteData from '@siteData';
2
- import { useDark, usePreferredDark } from '@vueuse/core';
3
- import { computed, inject, readonly, ref, shallowRef, watch } from 'vue';
4
- import { APPEARANCE_KEY, createTitle, inBrowser, resolveSiteDataByRoute } from '../shared';
5
- export const dataSymbol = Symbol();
6
- // site data is a singleton
7
- export const siteDataRef = shallowRef((import.meta.env.PROD ? siteData : readonly(siteData)));
8
- // hmr
9
- if (import.meta.hot) {
10
- import.meta.hot.accept('/@siteData', (m) => {
11
- if (m) {
12
- siteDataRef.value = m.default;
13
- }
14
- });
1
+ import { APPEARANCE_KEY, createTitle, resolveSiteDataByRoute } from "../shared.js";
2
+ import { computed, inject, readonly, ref, shallowRef } from "vue";
3
+ import { useDark, usePreferredDark } from "@vueuse/core";
4
+ import siteData from "@siteData";
5
+ //#region src/client/app/data.ts
6
+ const dataSymbol = Symbol();
7
+ const siteDataRef = shallowRef(readonly(siteData));
8
+ function initData(route) {
9
+ const site = computed(() => resolveSiteDataByRoute(siteDataRef.value, route.data.relativePath, route.data.filePath));
10
+ const appearance = site.value.appearance;
11
+ const isDark = appearance === "force-dark" ? ref(true) : appearance === "force-auto" ? usePreferredDark() : appearance ? useDark({
12
+ storageKey: APPEARANCE_KEY,
13
+ initialValue: () => appearance === "dark" ? "dark" : "auto",
14
+ ...typeof appearance === "object" ? appearance : {}
15
+ }) : ref(false);
16
+ return {
17
+ site,
18
+ theme: computed(() => site.value.themeConfig),
19
+ page: computed(() => route.data),
20
+ frontmatter: computed(() => route.data.frontmatter),
21
+ params: computed(() => route.data.params),
22
+ lang: computed(() => site.value.lang),
23
+ dir: computed(() => route.data.frontmatter.dir || site.value.dir),
24
+ localeIndex: computed(() => site.value.localeIndex || "root"),
25
+ title: computed(() => createTitle(site.value, route.data)),
26
+ description: computed(() => route.data.description || site.value.description),
27
+ isDark
28
+ };
15
29
  }
16
- // per-app data
17
- export function initData(route) {
18
- const site = computed(() => resolveSiteDataByRoute(siteDataRef.value, route.data.relativePath));
19
- const appearance = site.value.appearance; // fine with reactivity being lost here, config change triggers a restart
20
- const isDark = appearance === 'force-dark'
21
- ? ref(true)
22
- : appearance === 'force-auto'
23
- ? usePreferredDark()
24
- : appearance
25
- ? useDark({
26
- storageKey: APPEARANCE_KEY,
27
- initialValue: () => (appearance === 'dark' ? 'dark' : 'auto'),
28
- ...(typeof appearance === 'object' ? appearance : {})
29
- })
30
- : ref(false);
31
- const hashRef = ref(inBrowser ? location.hash : '');
32
- if (inBrowser) {
33
- window.addEventListener('hashchange', () => {
34
- hashRef.value = location.hash;
35
- });
36
- }
37
- watch(() => route.data, () => {
38
- hashRef.value = inBrowser ? location.hash : '';
39
- });
40
- return {
41
- site,
42
- theme: computed(() => site.value.themeConfig),
43
- page: computed(() => route.data),
44
- frontmatter: computed(() => route.data.frontmatter),
45
- params: computed(() => route.data.params),
46
- lang: computed(() => site.value.lang),
47
- dir: computed(() => route.data.frontmatter.dir || site.value.dir),
48
- localeIndex: computed(() => site.value.localeIndex || 'root'),
49
- title: computed(() => createTitle(site.value, route.data)),
50
- description: computed(() => route.data.description || site.value.description),
51
- isDark,
52
- hash: computed(() => hashRef.value)
53
- };
54
- }
55
- export function useData() {
56
- const data = inject(dataSymbol);
57
- if (!data) {
58
- throw new Error('vitepress data not properly injected in app');
59
- }
60
- return data;
30
+ function useData() {
31
+ const data = inject(dataSymbol);
32
+ if (!data) throw new Error("vitepress data not properly injected in app");
33
+ return data;
61
34
  }
35
+ //#endregion
36
+ export { dataSymbol, initData, siteDataRef, useData };
@@ -0,0 +1,7 @@
1
+ import { VitePressData } from "../shared.js";
2
+ import "./data.js";
3
+ import { Router } from "./router.js";
4
+ import { App } from "vue";
5
+ //#region src/client/app/devtools.d.ts
6
+ export declare const setupDevtools: (app: App, router: Router, data: VitePressData) => void;
7
+ //#endregion
@@ -1,29 +1,30 @@
1
- import { setupDevToolsPlugin } from '@vue/devtools-api';
2
- const COMPONENT_STATE_TYPE = 'VitePress';
3
- export const setupDevtools = (app, router, data) => {
4
- setupDevToolsPlugin({
5
- // fix recursive reference
6
- app: app,
7
- id: 'org.vuejs.vitepress',
8
- label: 'VitePress',
9
- packageName: 'vitepress',
10
- homepage: 'https://vitepress.dev',
11
- componentStateTypes: [COMPONENT_STATE_TYPE]
12
- }, (api) => {
13
- // TODO: remove any
14
- api.on.inspectComponent((payload) => {
15
- payload.instanceData.state.push({
16
- type: COMPONENT_STATE_TYPE,
17
- key: 'route',
18
- value: router.route,
19
- editable: false
20
- });
21
- payload.instanceData.state.push({
22
- type: COMPONENT_STATE_TYPE,
23
- key: 'data',
24
- value: data,
25
- editable: false
26
- });
27
- });
28
- });
1
+ import { setupDevToolsPlugin } from "@vue/devtools-api";
2
+ //#region src/client/app/devtools.ts
3
+ const COMPONENT_STATE_TYPE = "VitePress";
4
+ const setupDevtools = (app, router, data) => {
5
+ setupDevToolsPlugin({
6
+ app,
7
+ id: "org.vuejs.vitepress",
8
+ label: "VitePress",
9
+ packageName: "vitepress",
10
+ homepage: "https://vitepress.dev",
11
+ componentStateTypes: [COMPONENT_STATE_TYPE]
12
+ }, (api) => {
13
+ api.on.inspectComponent((payload) => {
14
+ payload.instanceData.state.push({
15
+ type: COMPONENT_STATE_TYPE,
16
+ key: "route",
17
+ value: router.route,
18
+ editable: false
19
+ });
20
+ payload.instanceData.state.push({
21
+ type: COMPONENT_STATE_TYPE,
22
+ key: "data",
23
+ value: data,
24
+ editable: false
25
+ });
26
+ });
27
+ });
29
28
  };
29
+ //#endregion
30
+ export { setupDevtools };
@@ -0,0 +1,11 @@
1
+ import { VitePressData } from "../shared.js";
2
+ import "./data.js";
3
+ import { Router } from "./router.js";
4
+ import { App } from "vue";
5
+ //#region src/client/app/index.d.ts
6
+ export declare function createApp(): Promise<{
7
+ app: App<any>;
8
+ router: Router;
9
+ data: VitePressData<any>;
10
+ }>;
11
+ //#endregion
@@ -1,141 +1,116 @@
1
- import RawTheme from '@theme/index';
2
- import { createApp as createClientApp, createSSRApp, defineComponent, h, onMounted, watchEffect } from 'vue';
3
- import { ClientOnly } from './components/ClientOnly';
4
- import { Content } from './components/Content';
5
- import { useCodeGroups } from './composables/codeGroups';
6
- import { useCopyCode } from './composables/copyCode';
7
- import { useUpdateHead } from './composables/head';
8
- import { usePrefetch } from './composables/preFetch';
9
- import { dataSymbol, initData, siteDataRef, useData } from './data';
10
- import { RouterSymbol, createRouter, scrollTo } from './router';
11
- import { inBrowser, pathToFile } from './utils';
1
+ import { ClientOnly } from "./components/ClientOnly.js";
2
+ import { inBrowser } from "../shared.js";
3
+ import { dataSymbol, initData, siteDataRef, useData } from "./data.js";
4
+ import { pathToFile } from "./utils.js";
5
+ import { Content } from "./components/Content.js";
6
+ import { RouterSymbol, createRouter, scrollTo } from "./router.js";
7
+ import { useCodeGroups } from "./composables/codeGroups.js";
8
+ import { useCopyCode } from "./composables/copyCode.js";
9
+ import { useUpdateHead } from "./composables/head.js";
10
+ import { usePrefetch } from "./composables/preFetch.js";
11
+ import { createApp as createApp$1, createSSRApp, defineComponent, h, watchEffect } from "vue";
12
+ import RawTheme from "@theme/index";
13
+ //#region src/client/app/index.ts
12
14
  function resolveThemeExtends(theme) {
13
- if (theme.extends) {
14
- const base = resolveThemeExtends(theme.extends);
15
- return {
16
- ...base,
17
- ...theme,
18
- async enhanceApp(ctx) {
19
- if (base.enhanceApp)
20
- await base.enhanceApp(ctx);
21
- if (theme.enhanceApp)
22
- await theme.enhanceApp(ctx);
23
- }
24
- };
25
- }
26
- return theme;
15
+ if (theme.extends) {
16
+ const base = resolveThemeExtends(theme.extends);
17
+ return {
18
+ ...base,
19
+ ...theme,
20
+ async enhanceApp(ctx) {
21
+ await base.enhanceApp?.(ctx);
22
+ await theme.enhanceApp?.(ctx);
23
+ },
24
+ setup() {
25
+ base.setup?.();
26
+ theme.setup?.();
27
+ }
28
+ };
29
+ }
30
+ return theme;
27
31
  }
28
32
  const Theme = resolveThemeExtends(RawTheme);
29
33
  const VitePressApp = defineComponent({
30
- name: 'VitePressApp',
31
- setup() {
32
- const { site, lang, dir } = useData();
33
- // change the language on the HTML element based on the current lang
34
- onMounted(() => {
35
- watchEffect(() => {
36
- document.documentElement.lang = lang.value;
37
- document.documentElement.dir = dir.value;
38
- });
39
- });
40
- if (import.meta.env.PROD && site.value.router.prefetchLinks) {
41
- // in prod mode, enable intersectionObserver based pre-fetch
42
- usePrefetch();
43
- }
44
- // setup global copy code handler
45
- useCopyCode();
46
- // setup global code groups handler
47
- useCodeGroups();
48
- if (Theme.setup)
49
- Theme.setup();
50
- return () => h(Theme.Layout);
51
- }
34
+ name: "VitePressApp",
35
+ setup() {
36
+ const { site, lang, dir } = useData();
37
+ if (inBrowser) watchEffect(() => {
38
+ document.documentElement.lang = lang.value;
39
+ document.documentElement.dir = dir.value;
40
+ });
41
+ if (import.meta.env.PROD && site.value.router.prefetchLinks) usePrefetch();
42
+ useCopyCode();
43
+ useCodeGroups();
44
+ if (Theme.setup) Theme.setup();
45
+ return () => h(Theme.Layout);
46
+ }
52
47
  });
53
- export async function createApp() {
54
- ;
55
- globalThis.__VITEPRESS__ = true;
56
- const router = newRouter();
57
- const app = newApp();
58
- app.provide(RouterSymbol, router);
59
- const data = initData(router.route);
60
- app.provide(dataSymbol, data);
61
- // install global components
62
- app.component('Content', Content);
63
- app.component('ClientOnly', ClientOnly);
64
- // expose $frontmatter & $params
65
- Object.defineProperties(app.config.globalProperties, {
66
- $frontmatter: {
67
- get() {
68
- return data.frontmatter.value;
69
- }
70
- },
71
- $params: {
72
- get() {
73
- return data.page.value.params;
74
- }
75
- }
76
- });
77
- if (Theme.enhanceApp) {
78
- await Theme.enhanceApp({
79
- app,
80
- router,
81
- siteData: siteDataRef
82
- });
83
- }
84
- // setup devtools in dev mode
85
- if (import.meta.env.DEV || __VUE_PROD_DEVTOOLS__) {
86
- import('./devtools.js').then(({ setupDevtools }) => setupDevtools(app, router, data));
87
- }
88
- return { app, router, data };
48
+ async function createApp() {
49
+ globalThis.__VITEPRESS__ = true;
50
+ const router = newRouter();
51
+ const app = newApp();
52
+ app.provide(RouterSymbol, router);
53
+ const data = initData(router.route);
54
+ app.provide(dataSymbol, data);
55
+ app.component("Content", Content);
56
+ app.component("ClientOnly", ClientOnly);
57
+ Object.defineProperties(app.config.globalProperties, {
58
+ $frontmatter: { get() {
59
+ return data.frontmatter.value;
60
+ } },
61
+ $params: { get() {
62
+ return data.page.value.params;
63
+ } }
64
+ });
65
+ if (import.meta.env.SSR) app.config.throwUnhandledErrorInProduction = true;
66
+ if (Theme.enhanceApp) await Theme.enhanceApp({
67
+ app,
68
+ router,
69
+ siteData: siteDataRef
70
+ });
71
+ if (import.meta.env.DEV || __VUE_PROD_DEVTOOLS__) import("./devtools.js").then(({ setupDevtools }) => setupDevtools(app, router, data));
72
+ return {
73
+ app,
74
+ router,
75
+ data
76
+ };
89
77
  }
90
78
  function newApp() {
91
- return import.meta.env.PROD
92
- ? createSSRApp(VitePressApp)
93
- : createClientApp(VitePressApp);
79
+ return import.meta.env.PROD ? createSSRApp(VitePressApp) : createApp$1(VitePressApp);
94
80
  }
95
81
  function newRouter() {
96
- let isInitialPageLoad = inBrowser;
97
- return createRouter((path) => {
98
- let pageFilePath = pathToFile(path);
99
- let pageModule = null;
100
- if (pageFilePath) {
101
- // use lean build if this is the initial page load
102
- if (isInitialPageLoad) {
103
- pageFilePath = pageFilePath.replace(/\.js$/, '.lean.js');
104
- }
105
- if (import.meta.env.DEV) {
106
- pageModule = import(/*@vite-ignore*/ pageFilePath).catch(() => {
107
- // try with/without trailing slash
108
- // in prod this is handled in src/client/app/utils.ts#pathToFile
109
- const url = new URL(pageFilePath, 'http://a.com');
110
- const path = (url.pathname.endsWith('/index.md')
111
- ? url.pathname.slice(0, -9) + '.md'
112
- : url.pathname.slice(0, -3) + '/index.md') +
113
- url.search +
114
- url.hash;
115
- return import(/*@vite-ignore*/ path);
116
- });
117
- }
118
- else {
119
- pageModule = import(/*@vite-ignore*/ pageFilePath);
120
- }
121
- }
122
- if (inBrowser) {
123
- isInitialPageLoad = false;
124
- }
125
- return pageModule;
126
- }, Theme.NotFound);
127
- }
128
- if (inBrowser) {
129
- createApp().then(({ app, router, data }) => {
130
- // wait until page component is fetched before mounting
131
- router.go(location.href, { initialLoad: true }).then(() => {
132
- // dynamically update head tags
133
- useUpdateHead(router.route, data.site);
134
- app.mount('#app');
135
- // scroll to hash on new tab during dev
136
- if (import.meta.env.DEV && location.hash) {
137
- scrollTo(location.hash);
138
- }
139
- });
140
- });
82
+ let isInitialPageLoad = inBrowser;
83
+ return createRouter((path) => {
84
+ let pageFilePath = pathToFile(path);
85
+ let pageModule = null;
86
+ if (pageFilePath) {
87
+ if (isInitialPageLoad) pageFilePath = pageFilePath.replace(/\.js$/, ".lean.js");
88
+ if (import.meta.env.DEV) pageModule = import(
89
+ /*@vite-ignore*/
90
+ pageFilePath
91
+ ).catch((e) => {
92
+ console.error(e);
93
+ const url = new URL(pageFilePath, "http://a.com");
94
+ return import(
95
+ /*@vite-ignore*/
96
+ (url.pathname.endsWith("/index.md") ? url.pathname.slice(0, -9) + ".md" : url.pathname.slice(0, -3) + "/index.md") + url.search + url.hash
97
+ );
98
+ });
99
+ else pageModule = import(
100
+ /*@vite-ignore*/
101
+ pageFilePath
102
+ );
103
+ }
104
+ if (inBrowser) isInitialPageLoad = false;
105
+ return pageModule;
106
+ }, Theme.NotFound);
141
107
  }
108
+ if (inBrowser) createApp().then(({ app, router, data }) => {
109
+ router.go(location.href, { initialLoad: true }).then(() => {
110
+ useUpdateHead(router.route, data.site);
111
+ app.mount("#app");
112
+ if (import.meta.env.DEV && location.hash) setTimeout(() => scrollTo(location.hash), 100);
113
+ });
114
+ });
115
+ //#endregion
116
+ export { createApp };
@@ -0,0 +1,49 @@
1
+ import { Awaitable, PageData, Route } from "../shared.js";
2
+ import { Component, InjectionKey } from "vue";
3
+ //#region src/client/app/router.d.ts
4
+ export interface Router {
5
+ /**
6
+ * Current route.
7
+ */
8
+ route: Route;
9
+ /**
10
+ * Navigate to a new URL.
11
+ */
12
+ go: (to: string, options?: {
13
+ initialLoad?: boolean;
14
+ replace?: boolean;
15
+ }) => Promise<void>;
16
+ /**
17
+ * Called before the route changes. Return `false` to cancel the navigation.
18
+ */
19
+ onBeforeRouteChange?: (to: string) => Awaitable<void | boolean>;
20
+ /**
21
+ * Called before the page component is loaded (after the history state is
22
+ * updated). Return `false` to cancel the navigation.
23
+ */
24
+ onBeforePageLoad?: (to: string) => Awaitable<void | boolean>;
25
+ /**
26
+ * Called after the page component is loaded (before the page component is updated).
27
+ */
28
+ onAfterPageLoad?: (to: string) => Awaitable<void>;
29
+ /**
30
+ * Called after the route changes.
31
+ */
32
+ onAfterRouteChange?: (to: string) => Awaitable<void>;
33
+ }
34
+ export declare const RouterSymbol: InjectionKey<Router>;
35
+ interface PageModule {
36
+ __pageData: PageData;
37
+ default: Component;
38
+ }
39
+ export declare function createRouter(loadPageModule: (path: string) => Awaitable<PageModule | null>, fallbackComponent?: Component): Router;
40
+ export declare function useRouter(): Router;
41
+ export declare function useRoute(): Route;
42
+ export declare function scrollTo(hash: string, scrollPosition?: number): void;
43
+ /**
44
+ * Resolves the URL of a link the router handles on the client side, or `null`
45
+ * if it's left to the browser (explicit `target`, `download`, `.vp-raw`,
46
+ * other origins, non-html files).
47
+ */
48
+ export declare function getRoutableLinkUrl(link: HTMLAnchorElement | SVGAElement): URL | null;
49
+ //#endregion