vitepress 0.22.4 → 1.0.0-alpha.11

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 (194) hide show
  1. package/README.md +3 -1
  2. package/bin/vitepress.js +1 -1
  3. package/client.d.ts +4 -3
  4. package/dist/client/app/components/ClientOnly.js +10 -10
  5. package/dist/client/app/components/Content.js +11 -11
  6. package/dist/client/app/composables/head.js +51 -85
  7. package/dist/client/app/composables/preFetch.js +94 -94
  8. package/dist/client/app/data.js +44 -47
  9. package/dist/client/app/devtools.js +28 -0
  10. package/dist/client/app/index.js +94 -110
  11. package/dist/client/app/router.js +200 -192
  12. package/dist/client/app/ssr.js +9 -0
  13. package/dist/client/app/theme.js +1 -1
  14. package/dist/client/app/utils.js +47 -46
  15. package/dist/client/index.d.ts +108 -113
  16. package/dist/client/index.js +9 -12
  17. package/dist/client/shared.js +109 -65
  18. package/dist/client/theme-default/Layout.vue +59 -176
  19. package/dist/client/theme-default/NotFound.vue +77 -16
  20. package/dist/client/theme-default/components/VPAlgoliaSearchBox.vue +93 -0
  21. package/dist/client/theme-default/components/VPBackdrop.vue +39 -0
  22. package/dist/client/theme-default/components/VPButton.vue +124 -0
  23. package/dist/client/theme-default/components/VPCarbonAds.vue +90 -0
  24. package/dist/client/theme-default/components/VPContent.vue +84 -0
  25. package/dist/client/theme-default/components/VPDoc.vue +175 -0
  26. package/dist/client/theme-default/components/VPDocAside.vue +46 -0
  27. package/dist/client/theme-default/components/VPDocAsideCarbonAds.vue +13 -0
  28. package/dist/client/theme-default/components/VPDocAsideOutline.vue +122 -0
  29. package/dist/client/theme-default/components/VPDocAsideSponsors.vue +17 -0
  30. package/dist/client/theme-default/components/VPDocFooter.vue +167 -0
  31. package/dist/client/theme-default/components/VPDocFooterLastUpdated.vue +43 -0
  32. package/dist/client/theme-default/components/VPFeature.vue +55 -0
  33. package/dist/client/theme-default/components/VPFeatures.vue +107 -0
  34. package/dist/client/theme-default/components/VPFlyout.vue +156 -0
  35. package/dist/client/theme-default/components/VPFooter.vue +53 -0
  36. package/dist/client/theme-default/components/VPHero.vue +314 -0
  37. package/dist/client/theme-default/components/VPHome.vue +35 -0
  38. package/dist/client/theme-default/components/VPHomeFeatures.vue +14 -0
  39. package/dist/client/theme-default/components/VPHomeHero.vue +18 -0
  40. package/dist/client/theme-default/components/VPHomeSponsors.vue +93 -0
  41. package/dist/client/theme-default/components/VPImage.vue +38 -0
  42. package/dist/client/theme-default/components/VPLink.vue +39 -0
  43. package/dist/client/theme-default/components/VPLocalNav.vue +108 -0
  44. package/dist/client/theme-default/components/VPMenu.vue +82 -0
  45. package/dist/client/theme-default/components/VPMenuGroup.vue +46 -0
  46. package/dist/client/theme-default/components/VPMenuLink.vue +55 -0
  47. package/dist/client/theme-default/components/VPNav.vue +64 -0
  48. package/dist/client/theme-default/components/VPNavBar.vue +139 -0
  49. package/dist/client/theme-default/components/VPNavBarAppearance.vue +25 -0
  50. package/dist/client/theme-default/components/VPNavBarExtra.vue +82 -0
  51. package/dist/client/theme-default/components/VPNavBarHamburger.vue +79 -0
  52. package/dist/client/theme-default/components/VPNavBarMenu.vue +29 -0
  53. package/dist/client/theme-default/components/VPNavBarMenuGroup.vue +27 -0
  54. package/dist/client/theme-default/components/VPNavBarMenuLink.vue +56 -0
  55. package/dist/client/theme-default/components/VPNavBarSearch.vue +287 -0
  56. package/dist/client/theme-default/components/VPNavBarSocialLinks.vue +27 -0
  57. package/dist/client/theme-default/components/VPNavBarTitle.vue +62 -0
  58. package/dist/client/theme-default/components/VPNavBarTranslations.vue +45 -0
  59. package/dist/client/theme-default/components/VPNavScreen.vue +103 -0
  60. package/dist/client/theme-default/components/VPNavScreenAppearance.vue +33 -0
  61. package/dist/client/theme-default/components/VPNavScreenMenu.vue +24 -0
  62. package/dist/client/theme-default/components/VPNavScreenMenuGroup.vue +117 -0
  63. package/dist/client/theme-default/components/VPNavScreenMenuGroupLink.vue +33 -0
  64. package/dist/client/theme-default/components/VPNavScreenMenuGroupSection.vue +35 -0
  65. package/dist/client/theme-default/components/VPNavScreenMenuLink.vue +34 -0
  66. package/dist/client/theme-default/components/VPNavScreenSocialLinks.vue +14 -0
  67. package/dist/client/theme-default/components/VPNavScreenTranslations.vue +73 -0
  68. package/dist/client/theme-default/components/VPPage.vue +5 -0
  69. package/dist/client/theme-default/components/VPSidebar.vue +121 -0
  70. package/dist/client/theme-default/components/VPSidebarGroup.vue +124 -0
  71. package/dist/client/theme-default/components/VPSidebarLink.vue +69 -0
  72. package/dist/client/theme-default/components/VPSkipLink.vue +72 -0
  73. package/dist/client/theme-default/components/VPSocialLink.vue +49 -0
  74. package/dist/client/theme-default/components/VPSocialLinks.vue +27 -0
  75. package/dist/client/theme-default/components/VPSponsors.vue +46 -0
  76. package/dist/client/theme-default/components/VPSponsorsGrid.vue +50 -0
  77. package/dist/client/theme-default/components/VPSwitch.vue +66 -0
  78. package/dist/client/theme-default/components/VPSwitchAppearance.vue +74 -0
  79. package/dist/client/theme-default/components/VPTeamMembers.vue +55 -0
  80. package/dist/client/theme-default/components/VPTeamMembersItem.vue +215 -0
  81. package/dist/client/theme-default/components/VPTeamPage.vue +53 -0
  82. package/dist/client/theme-default/components/VPTeamPageSection.vue +77 -0
  83. package/dist/client/theme-default/components/VPTeamPageTitle.vue +63 -0
  84. package/dist/client/theme-default/components/icons/VPIconAlignJustify.vue +8 -0
  85. package/dist/client/theme-default/components/icons/VPIconAlignLeft.vue +8 -0
  86. package/dist/client/theme-default/components/icons/VPIconAlignRight.vue +8 -0
  87. package/dist/client/theme-default/components/icons/{ArrowLeft.vue → VPIconArrowLeft.vue} +0 -0
  88. package/dist/client/theme-default/components/icons/{ArrowRight.vue → VPIconArrowRight.vue} +0 -0
  89. package/dist/client/theme-default/components/icons/VPIconChevronDown.vue +5 -0
  90. package/dist/client/theme-default/components/icons/VPIconChevronLeft.vue +5 -0
  91. package/dist/client/theme-default/components/icons/VPIconChevronRight.vue +5 -0
  92. package/dist/client/theme-default/components/icons/VPIconChevronUp.vue +5 -0
  93. package/dist/client/theme-default/components/icons/VPIconEdit.vue +6 -0
  94. package/dist/client/theme-default/components/icons/VPIconExternalLink.vue +13 -0
  95. package/dist/client/theme-default/components/icons/VPIconHeart.vue +5 -0
  96. package/dist/client/theme-default/components/icons/VPIconLanguages.vue +9 -0
  97. package/dist/client/theme-default/components/icons/VPIconMinus.vue +5 -0
  98. package/dist/client/theme-default/components/icons/VPIconMinusSquare.vue +6 -0
  99. package/dist/client/theme-default/components/icons/VPIconMoon.vue +5 -0
  100. package/dist/client/theme-default/components/icons/VPIconMoreHorizontal.vue +7 -0
  101. package/dist/client/theme-default/components/icons/VPIconPlus.vue +5 -0
  102. package/dist/client/theme-default/components/icons/VPIconPlusSquare.vue +6 -0
  103. package/dist/client/theme-default/components/icons/VPIconSun.vue +13 -0
  104. package/dist/client/theme-default/composables/aside.js +17 -0
  105. package/dist/client/theme-default/composables/copy-code.js +71 -0
  106. package/dist/client/theme-default/composables/edit-link.js +11 -0
  107. package/dist/client/theme-default/composables/flyout.js +40 -0
  108. package/dist/client/theme-default/composables/nav.js +53 -25
  109. package/dist/client/theme-default/composables/outline.js +96 -0
  110. package/dist/client/theme-default/composables/prev-next.js +22 -0
  111. package/dist/client/theme-default/composables/sidebar.js +63 -0
  112. package/dist/client/theme-default/composables/sponsor-grid.js +94 -0
  113. package/dist/client/theme-default/fonts/inter-cyrillic-ext.woff2 +0 -0
  114. package/dist/client/theme-default/fonts/inter-cyrillic.woff2 +0 -0
  115. package/dist/client/theme-default/fonts/inter-greek-ext.woff2 +0 -0
  116. package/dist/client/theme-default/fonts/inter-greek.woff2 +0 -0
  117. package/dist/client/theme-default/fonts/inter-italic-cyrillic-ext.woff2 +0 -0
  118. package/dist/client/theme-default/fonts/inter-italic-cyrillic.woff2 +0 -0
  119. package/dist/client/theme-default/fonts/inter-italic-greek-ext.woff2 +0 -0
  120. package/dist/client/theme-default/fonts/inter-italic-greek.woff2 +0 -0
  121. package/dist/client/theme-default/fonts/inter-italic-latin-ext.woff2 +0 -0
  122. package/dist/client/theme-default/fonts/inter-italic-latin.woff2 +0 -0
  123. package/dist/client/theme-default/fonts/inter-italic-vietnamese.woff2 +0 -0
  124. package/dist/client/theme-default/fonts/inter-latin-ext.woff2 +0 -0
  125. package/dist/client/theme-default/fonts/inter-latin.woff2 +0 -0
  126. package/dist/client/theme-default/fonts/inter-roman-cyrillic-ext.woff2 +0 -0
  127. package/dist/client/theme-default/fonts/inter-roman-cyrillic.woff2 +0 -0
  128. package/dist/client/theme-default/fonts/inter-roman-greek-ext.woff2 +0 -0
  129. package/dist/client/theme-default/fonts/inter-roman-greek.woff2 +0 -0
  130. package/dist/client/theme-default/fonts/inter-roman-latin-ext.woff2 +0 -0
  131. package/dist/client/theme-default/fonts/inter-roman-latin.woff2 +0 -0
  132. package/dist/client/theme-default/fonts/inter-roman-vietnamese.woff2 +0 -0
  133. package/dist/client/theme-default/fonts/inter-vietnamese.woff2 +0 -0
  134. package/dist/client/theme-default/index.js +23 -12
  135. package/dist/client/theme-default/styles/base.css +215 -0
  136. package/dist/client/theme-default/styles/components/custom-block.css +90 -0
  137. package/dist/client/theme-default/styles/components/vp-code.css +7 -0
  138. package/dist/client/theme-default/styles/components/vp-doc.css +445 -0
  139. package/dist/client/theme-default/styles/components/vp-sponsor.css +155 -0
  140. package/dist/client/theme-default/styles/fonts.css +217 -0
  141. package/dist/client/theme-default/styles/utils.css +9 -0
  142. package/dist/client/theme-default/styles/vars.css +340 -54
  143. package/dist/client/theme-default/support/sidebar.js +37 -0
  144. package/dist/client/theme-default/support/socialIcons.js +11 -0
  145. package/dist/client/theme-default/support/utils.js +63 -0
  146. package/dist/node/cli.js +40 -32
  147. package/dist/node/index.d.ts +439 -278
  148. package/dist/node/index.js +23 -37
  149. package/dist/node/serve-d62982a1.js +66392 -0
  150. package/dist/node-cjs/cli.cjs +316 -0
  151. package/dist/node-cjs/index.cjs +39 -0
  152. package/dist/{node/serve-3035f99b.js → node-cjs/serve-dd119bdb.cjs} +33134 -22707
  153. package/package.json +115 -79
  154. package/theme.d.ts +13 -3
  155. package/types/default-theme.d.ts +183 -74
  156. package/types/index.d.ts +35 -2
  157. package/types/shared.d.ts +22 -8
  158. package/dist/client/app/components/Debug.vue +0 -86
  159. package/dist/client/theme-default/components/AlgoliaSearchBox.vue +0 -188
  160. package/dist/client/theme-default/components/BuySellAds.vue +0 -152
  161. package/dist/client/theme-default/components/CarbonAds.vue +0 -99
  162. package/dist/client/theme-default/components/EditLink.vue +0 -38
  163. package/dist/client/theme-default/components/Home.vue +0 -31
  164. package/dist/client/theme-default/components/HomeFeatures.vue +0 -143
  165. package/dist/client/theme-default/components/HomeFooter.vue +0 -50
  166. package/dist/client/theme-default/components/HomeHero.vue +0 -161
  167. package/dist/client/theme-default/components/LastUpdated.vue +0 -60
  168. package/dist/client/theme-default/components/NavBar.vue +0 -60
  169. package/dist/client/theme-default/components/NavBarTitle.vue +0 -41
  170. package/dist/client/theme-default/components/NavDropdownLink.vue +0 -135
  171. package/dist/client/theme-default/components/NavDropdownLinkItem.vue +0 -76
  172. package/dist/client/theme-default/components/NavLink.vue +0 -61
  173. package/dist/client/theme-default/components/NavLinks.vue +0 -52
  174. package/dist/client/theme-default/components/NextAndPrevLinks.vue +0 -88
  175. package/dist/client/theme-default/components/Page.vue +0 -53
  176. package/dist/client/theme-default/components/PageFooter.vue +0 -44
  177. package/dist/client/theme-default/components/SideBar.vue +0 -60
  178. package/dist/client/theme-default/components/SideBarLink.js +0 -68
  179. package/dist/client/theme-default/components/SideBarLinks.vue +0 -12
  180. package/dist/client/theme-default/components/ToggleSideBarButton.vue +0 -46
  181. package/dist/client/theme-default/components/icons/OutboundLink.vue +0 -31
  182. package/dist/client/theme-default/composables/activeSidebarLink.js +0 -99
  183. package/dist/client/theme-default/composables/editLink.js +0 -49
  184. package/dist/client/theme-default/composables/navLink.js +0 -42
  185. package/dist/client/theme-default/composables/nextAndPrevLinks.js +0 -37
  186. package/dist/client/theme-default/composables/repo.js +0 -38
  187. package/dist/client/theme-default/composables/sideBar.js +0 -57
  188. package/dist/client/theme-default/config.js +0 -1
  189. package/dist/client/theme-default/styles/code.css +0 -299
  190. package/dist/client/theme-default/styles/custom-blocks.css +0 -76
  191. package/dist/client/theme-default/styles/layout.css +0 -236
  192. package/dist/client/theme-default/styles/sidebar-links.css +0 -107
  193. package/dist/client/theme-default/support/sideBar.js +0 -46
  194. package/dist/client/theme-default/utils.js +0 -63
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # (WIP) VitePress 📝💨
1
+ # VitePress (alpha) 📝💨
2
2
 
3
3
  [![Test](https://github.com/vuejs/vitepress/workflows/Test/badge.svg)](https://github.com/vuejs/vitepress/actions)
4
4
  [![npm](https://img.shields.io/npm/v/vitepress)](https://www.npmjs.com/package/vitepress)
@@ -7,6 +7,8 @@
7
7
 
8
8
  VitePress is [VuePress](https://vuepress.vuejs.org)' spiritual successor, built on top of [vite](https://github.com/vitejs/vite).
9
9
 
10
+ Currently, it's in the `alpha` stage. It is already suitable for out-of-the-box documentation use, but the config and theming API may still change between minor releases.
11
+
10
12
  ## Documentation
11
13
 
12
14
  To check out docs, visit [vitepress.vuejs.org](https://vitepress.vuejs.org).
package/bin/vitepress.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- require('../dist/node/cli')
2
+ import('../dist/node/cli.js')
package/client.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- // re-export vite client types
2
- // with strict installers like pnpm, user won't be able to reference vite/client
3
- // in project root
1
+ // re-export vite client types. with strict installers like pnpm, user won't
2
+ // be able to reference vite/client in project root.
4
3
  /// <reference types="vite/client" />
4
+
5
+ export * from './dist/client/index.js'
@@ -1,10 +1,10 @@
1
- import { ref, onMounted, defineComponent } from 'vue';
2
- export const ClientOnly = defineComponent({
3
- setup(_, { slots }) {
4
- const show = ref(false);
5
- onMounted(() => {
6
- show.value = true;
7
- });
8
- return () => (show.value && slots.default ? slots.default() : null);
9
- }
10
- });
1
+ import { defineComponent, ref, onMounted } from 'vue';
2
+ export const ClientOnly = defineComponent({
3
+ setup(_, { slots }) {
4
+ const show = ref(false);
5
+ onMounted(() => {
6
+ show.value = true;
7
+ });
8
+ return () => (show.value && slots.default ? slots.default() : null);
9
+ }
10
+ });
@@ -1,11 +1,11 @@
1
- import { defineComponent, h } from 'vue';
2
- import { useRoute } from '../router';
3
- export const Content = defineComponent({
4
- name: 'VitePressContent',
5
- setup() {
6
- const route = useRoute();
7
- return () => h('div', { style: { position: 'relative' } }, [
8
- route.component ? h(route.component) : null
9
- ]);
10
- }
11
- });
1
+ import { defineComponent, h } from 'vue';
2
+ import { useRoute } from '../router.js';
3
+ export const Content = defineComponent({
4
+ name: 'VitePressContent',
5
+ setup() {
6
+ const route = useRoute();
7
+ return () => h('div', { style: { position: 'relative' } }, [
8
+ route.component ? h(route.component) : null
9
+ ]);
10
+ }
11
+ });
@@ -1,85 +1,51 @@
1
- import { watchEffect } from 'vue';
2
- export function useUpdateHead(route, siteDataByRouteRef) {
3
- let managedHeadTags = [];
4
- let isFirstUpdate = true;
5
- const updateHeadTags = (newTags) => {
6
- if (import.meta.env.PROD && isFirstUpdate) {
7
- // in production, the initial meta tags are already pre-rendered so we
8
- // skip the first update.
9
- isFirstUpdate = false;
10
- return;
11
- }
12
- const newEls = [];
13
- const commonLength = Math.min(managedHeadTags.length, newTags.length);
14
- for (let i = 0; i < commonLength; i++) {
15
- let el = managedHeadTags[i];
16
- const [tag, attrs, innerHTML = ''] = newTags[i];
17
- if (el.tagName.toLocaleLowerCase() === tag) {
18
- for (const key in attrs) {
19
- if (el.getAttribute(key) !== attrs[key]) {
20
- el.setAttribute(key, attrs[key]);
21
- }
22
- }
23
- for (let i = 0; i < el.attributes.length; i++) {
24
- const name = el.attributes[i].name;
25
- if (!(name in attrs)) {
26
- el.removeAttribute(name);
27
- }
28
- }
29
- if (el.innerHTML !== innerHTML) {
30
- el.innerHTML = innerHTML;
31
- }
32
- }
33
- else {
34
- document.head.removeChild(el);
35
- el = createHeadElement(newTags[i]);
36
- document.head.append(el);
37
- }
38
- newEls.push(el);
39
- }
40
- managedHeadTags
41
- .slice(commonLength)
42
- .forEach((el) => document.head.removeChild(el));
43
- newTags.slice(commonLength).forEach((headConfig) => {
44
- const el = createHeadElement(headConfig);
45
- document.head.appendChild(el);
46
- newEls.push(el);
47
- });
48
- managedHeadTags = newEls;
49
- };
50
- watchEffect(() => {
51
- const pageData = route.data;
52
- const siteData = siteDataByRouteRef.value;
53
- const pageTitle = pageData && pageData.title;
54
- const pageDescription = pageData && pageData.description;
55
- const frontmatterHead = pageData && pageData.frontmatter.head;
56
- // update title and description
57
- document.title = (pageTitle ? pageTitle + ` | ` : ``) + siteData.title;
58
- document
59
- .querySelector(`meta[name=description]`)
60
- .setAttribute('content', pageDescription || siteData.description);
61
- updateHeadTags([
62
- // site head can only change during dev
63
- ...(import.meta.env.DEV ? siteData.head : []),
64
- ...(frontmatterHead ? filterOutHeadDescription(frontmatterHead) : [])
65
- ]);
66
- });
67
- }
68
- function createHeadElement([tag, attrs, innerHTML]) {
69
- const el = document.createElement(tag);
70
- for (const key in attrs) {
71
- el.setAttribute(key, attrs[key]);
72
- }
73
- if (innerHTML) {
74
- el.innerHTML = innerHTML;
75
- }
76
- return el;
77
- }
78
- function isMetaDescription(headConfig) {
79
- return (headConfig[0] === 'meta' &&
80
- headConfig[1] &&
81
- headConfig[1].name === 'description');
82
- }
83
- function filterOutHeadDescription(head) {
84
- return head.filter((h) => !isMetaDescription(h));
85
- }
1
+ import { watchEffect } from 'vue';
2
+ import { createTitle, mergeHead } from '../../shared.js';
3
+ export function useUpdateHead(route, siteDataByRouteRef) {
4
+ let managedHeadTags = [];
5
+ let isFirstUpdate = true;
6
+ const updateHeadTags = (newTags) => {
7
+ if (import.meta.env.PROD && isFirstUpdate) {
8
+ // in production, the initial meta tags are already pre-rendered so we
9
+ // skip the first update.
10
+ isFirstUpdate = false;
11
+ return;
12
+ }
13
+ managedHeadTags.forEach((el) => document.head.removeChild(el));
14
+ managedHeadTags = [];
15
+ newTags.forEach((headConfig) => {
16
+ const el = createHeadElement(headConfig);
17
+ document.head.appendChild(el);
18
+ managedHeadTags.push(el);
19
+ });
20
+ };
21
+ watchEffect(() => {
22
+ const pageData = route.data;
23
+ const siteData = siteDataByRouteRef.value;
24
+ const pageDescription = pageData && pageData.description;
25
+ const frontmatterHead = (pageData && pageData.frontmatter.head) || [];
26
+ // update title and description
27
+ document.title = createTitle(siteData, pageData);
28
+ document
29
+ .querySelector(`meta[name=description]`)
30
+ .setAttribute('content', pageDescription || siteData.description);
31
+ updateHeadTags(mergeHead(siteData.head, filterOutHeadDescription(frontmatterHead)));
32
+ });
33
+ }
34
+ function createHeadElement([tag, attrs, innerHTML]) {
35
+ const el = document.createElement(tag);
36
+ for (const key in attrs) {
37
+ el.setAttribute(key, attrs[key]);
38
+ }
39
+ if (innerHTML) {
40
+ el.innerHTML = innerHTML;
41
+ }
42
+ return el;
43
+ }
44
+ function isMetaDescription(headConfig) {
45
+ return (headConfig[0] === 'meta' &&
46
+ headConfig[1] &&
47
+ headConfig[1].name === 'description');
48
+ }
49
+ function filterOutHeadDescription(head) {
50
+ return head.filter((h) => !isMetaDescription(h));
51
+ }
@@ -1,94 +1,94 @@
1
- // Customized pre-fetch for page chunks based on
2
- // https://github.com/GoogleChromeLabs/quicklink
3
- import { useRoute } from '../router';
4
- import { onMounted, onUnmounted, watch } from 'vue';
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);
13
- };
14
- const viaXHR = (url) => {
15
- const req = new XMLHttpRequest();
16
- req.open('GET', url, (req.withCredentials = true));
17
- req.send();
18
- };
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
- doFetch(pageChunkPath);
56
- }
57
- }
58
- });
59
- });
60
- rIC(() => {
61
- document.querySelectorAll('#app a').forEach((link) => {
62
- const { target, hostname, pathname } = link;
63
- const extMatch = pathname.match(/\.\w+$/);
64
- if (extMatch && extMatch[0] !== '.html') {
65
- return;
66
- }
67
- if (
68
- // only prefetch same tab navigation, since a new tab will load
69
- // the lean js chunk instead.
70
- target !== `_blank` &&
71
- // only prefetch inbound links
72
- hostname === location.hostname) {
73
- if (pathname !== location.pathname) {
74
- observer.observe(link);
75
- }
76
- else {
77
- // No need to prefetch chunk for the current page, but also mark
78
- // it as already fetched. This is because the initial page uses its
79
- // lean chunk, and if we don't mark it, navigation to another page
80
- // with a link back to the first page will fetch its full chunk
81
- // which isn't needed.
82
- hasFetched.add(pathname);
83
- }
84
- }
85
- });
86
- });
87
- };
88
- onMounted(observeLinks);
89
- const route = useRoute();
90
- watch(() => route.path, observeLinks);
91
- onUnmounted(() => {
92
- observer && observer.disconnect();
93
- });
94
- }
1
+ // Customized pre-fetch for page chunks based on
2
+ // https://github.com/GoogleChromeLabs/quicklink
3
+ import { useRoute } from '../router.js';
4
+ import { onMounted, onUnmounted, watch } from 'vue';
5
+ import { inBrowser, pathToFile } from '../utils.js';
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);
13
+ };
14
+ const viaXHR = (url) => {
15
+ const req = new XMLHttpRequest();
16
+ req.open('GET', url, (req.withCredentials = true));
17
+ req.send();
18
+ };
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
+ doFetch(pageChunkPath);
56
+ }
57
+ }
58
+ });
59
+ });
60
+ rIC(() => {
61
+ document.querySelectorAll('#app a').forEach((link) => {
62
+ const { target, hostname, pathname } = link;
63
+ const extMatch = pathname.match(/\.\w+$/);
64
+ if (extMatch && extMatch[0] !== '.html') {
65
+ return;
66
+ }
67
+ if (
68
+ // only prefetch same tab navigation, since a new tab will load
69
+ // the lean js chunk instead.
70
+ target !== `_blank` &&
71
+ // only prefetch inbound links
72
+ hostname === location.hostname) {
73
+ if (pathname !== location.pathname) {
74
+ observer.observe(link);
75
+ }
76
+ else {
77
+ // No need to prefetch chunk for the current page, but also mark
78
+ // it as already fetched. This is because the initial page uses its
79
+ // lean chunk, and if we don't mark it, navigation to another page
80
+ // with a link back to the first page will fetch its full chunk
81
+ // which isn't needed.
82
+ hasFetched.add(pathname);
83
+ }
84
+ }
85
+ });
86
+ });
87
+ };
88
+ onMounted(observeLinks);
89
+ const route = useRoute();
90
+ watch(() => route.path, observeLinks);
91
+ onUnmounted(() => {
92
+ observer && observer.disconnect();
93
+ });
94
+ }
@@ -1,47 +1,44 @@
1
- import { shallowRef, readonly, computed, inject } from 'vue';
2
- import serializedSiteData from '@siteData';
3
- import { resolveSiteDataByRoute } from '../shared';
4
- import { withBase } from './utils';
5
- export const dataSymbol = Symbol();
6
- export const siteDataRef = shallowRef(parse(serializedSiteData));
7
- function parse(data) {
8
- const parsed = JSON.parse(data);
9
- return (import.meta.env.DEV ? readonly(parsed) : parsed);
10
- }
11
- // hmr
12
- if (import.meta.hot) {
13
- import.meta.hot.accept('/@siteData', (m) => {
14
- siteDataRef.value = parse(m.default);
15
- });
16
- }
17
- // per-app data
18
- export function initData(route) {
19
- const site = computed(() => resolveSiteDataByRoute(siteDataRef.value, route.path));
20
- return {
21
- site,
22
- theme: computed(() => site.value.themeConfig),
23
- page: computed(() => route.data),
24
- frontmatter: computed(() => route.data.frontmatter),
25
- lang: computed(() => site.value.lang),
26
- localePath: computed(() => {
27
- const { langs, lang } = site.value;
28
- const path = Object.keys(langs).find((langPath) => langs[langPath].lang === lang);
29
- return withBase(path || '/');
30
- }),
31
- title: computed(() => {
32
- return route.data.title
33
- ? route.data.title + ' | ' + site.value.title
34
- : site.value.title;
35
- }),
36
- description: computed(() => {
37
- return route.data.description || site.value.description;
38
- })
39
- };
40
- }
41
- export function useData() {
42
- const data = inject(dataSymbol);
43
- if (!data) {
44
- throw new Error('vitepress data not properly injected in app');
45
- }
46
- return data;
47
- }
1
+ import { shallowRef, readonly, computed, inject } from 'vue';
2
+ import siteData from '@siteData';
3
+ import { resolveSiteDataByRoute, createTitle } from '../shared.js';
4
+ import { withBase } from './utils.js';
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
+ });
15
+ }
16
+ // per-app data
17
+ export function initData(route) {
18
+ const site = computed(() => resolveSiteDataByRoute(siteDataRef.value, route.path));
19
+ return {
20
+ site,
21
+ theme: computed(() => site.value.themeConfig),
22
+ page: computed(() => route.data),
23
+ frontmatter: computed(() => route.data.frontmatter),
24
+ lang: computed(() => site.value.lang),
25
+ localePath: computed(() => {
26
+ const { langs, lang } = site.value;
27
+ const path = Object.keys(langs).find((langPath) => langs[langPath].lang === lang);
28
+ return withBase(path || '/');
29
+ }),
30
+ title: computed(() => {
31
+ return createTitle(site.value, route.data);
32
+ }),
33
+ description: computed(() => {
34
+ return route.data.description || site.value.description;
35
+ })
36
+ };
37
+ }
38
+ export function useData() {
39
+ const data = inject(dataSymbol);
40
+ if (!data) {
41
+ throw new Error('vitepress data not properly injected in app');
42
+ }
43
+ return data;
44
+ }
@@ -0,0 +1,28 @@
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.vuejs.org',
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
+ });
28
+ };