Skip to content

Commit

Permalink
Merge 46bba07 into 49f6f48
Browse files Browse the repository at this point in the history
  • Loading branch information
Mister-Hope committed Jan 7, 2024
2 parents 49f6f48 + 46bba07 commit 5771a39
Show file tree
Hide file tree
Showing 46 changed files with 531 additions and 401 deletions.
9 changes: 9 additions & 0 deletions e2e/docs/.vuepress/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,13 @@ export default defineUserConfig({
bundler: E2E_BUNDLER === 'webpack' ? webpackBundler() : viteBundler(),

theme: e2eTheme(),

extendsPage: (page) => {
if (page.path === '/page-data/meta.html')
page.meta = {
a: 1,
b: 2,
...page.meta,
}
},
})
5 changes: 5 additions & 0 deletions e2e/docs/page-data/meta.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
meta:
a: 0
c: 3
---
8 changes: 2 additions & 6 deletions packages/cli/src/commands/dev/handlePageAdd.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@ import {
createPage,
preparePageComponent,
preparePageData,
preparePagesComponents,
preparePagesData,
preparePagesRoutes,
preparePagesMap,
} from '@vuepress/core'
import type { App, Page } from '@vuepress/core'

Expand Down Expand Up @@ -36,9 +34,7 @@ export const handlePageAdd = async (
await preparePageData(app, page)

// prepare pages entry
await preparePagesComponents(app)
await preparePagesData(app)
await preparePagesRoutes(app)
await preparePagesMap(app)

return page
}
20 changes: 6 additions & 14 deletions packages/cli/src/commands/dev/handlePageChange.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@ import {
createPage,
preparePageComponent,
preparePageData,
preparePagesComponents,
preparePagesData,
preparePagesRoutes,
preparePagesMap,
} from '@vuepress/core'
import type { App, Page } from '@vuepress/core'

Expand Down Expand Up @@ -39,18 +37,12 @@ export const handlePageChange = async (
await preparePageData(app, pageNew)

const isPathChanged = pageOld.path !== pageNew.path
const isRouteMetaChanged =
JSON.stringify(pageOld.routeMeta) !== JSON.stringify(pageNew.routeMeta)
const isMetaChanged =
JSON.stringify(pageOld.meta) !== JSON.stringify(pageNew.meta)

// prepare pages entry if the path is changed
if (isPathChanged) {
await preparePagesComponents(app)
await preparePagesData(app)
}

// prepare pages routes if the path or routeMeta is changed
if (isPathChanged || isRouteMetaChanged) {
await preparePagesRoutes(app)
// prepare pages map if the path or meta is changed
if (isPathChanged || isMetaChanged) {
await preparePagesMap(app)
}

return [pageOld, pageNew]
Expand Down
10 changes: 2 additions & 8 deletions packages/cli/src/commands/dev/handlePageUnlink.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
import {
preparePagesComponents,
preparePagesData,
preparePagesRoutes,
} from '@vuepress/core'
import { preparePagesMap } from '@vuepress/core'
import type { App, Page } from '@vuepress/core'

/**
Expand All @@ -26,9 +22,7 @@ export const handlePageUnlink = async (
app.pages.splice(pageIndex, 1)

// re-prepare page files
await preparePagesComponents(app)
await preparePagesData(app)
await preparePagesRoutes(app)
await preparePagesMap(app)

return page
}
4 changes: 1 addition & 3 deletions packages/client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,7 @@
"external": [
"@internal/clientConfigs",
"@internal/layoutComponents",
"@internal/pagesComponents",
"@internal/pagesData",
"@internal/pagesRoutes",
"@internal/pagesMap",
"@internal/siteData"
],
"format": [
Expand Down
7 changes: 3 additions & 4 deletions packages/client/src/components/Content.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { pagesComponents } from '@internal/pagesComponents'
import { computed, defineComponent, h } from 'vue'
import { usePageData } from '../composables/index.js'
import { pagesMap, usePageData } from '../composables/index.js'

/**
* Markdown rendered content
Expand All @@ -10,7 +9,7 @@ export const Content = defineComponent({
name: 'Content',

props: {
pageKey: {
path: {
type: String,
required: false,
default: '',
Expand All @@ -20,7 +19,7 @@ export const Content = defineComponent({
setup(props) {
const page = usePageData()
const pageComponent = computed(
() => pagesComponents[props.pageKey || page.value.key],
() => pagesMap.value.get(props.path || page.value.path)?.comp,
)
return () =>
pageComponent.value
Expand Down
56 changes: 56 additions & 0 deletions packages/client/src/components/VPLink.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { h } from 'vue'
import type { FunctionalComponent, VNode } from 'vue'
import { useRouter } from 'vue-router'
import { pagesMap, redirectsMap } from '../composables/index.js'
import { withBase } from '../helpers/index.js'
import { resolvers } from '../resolvers.js'

/**
* Forked from https://github.com/vuejs/router/blob/941b2131e80550009e5221d4db9f366b1fea3fd5/packages/router/src/RouterLink.ts#L293
*/
const guardEvent = (event: MouseEvent): boolean | void => {
// don't redirect with control keys
if (event.metaKey || event.altKey || event.ctrlKey || event.shiftKey) return
// don't redirect when preventDefault called
if (event.defaultPrevented) return
// don't redirect on right click
if (event.button !== undefined && event.button !== 0) return
// don't redirect if `target="_blank"`
if (event.currentTarget) {
const target = (event.currentTarget as HTMLElement).getAttribute('target')
if (target?.match(/\b_blank\b/i)) return
}
event.preventDefault()
return true
}

interface VPLinkProps {
to: string
}

export const VPLink: FunctionalComponent<
VPLinkProps,
Record<never, never>,
{
default: () => string | VNode | (string | VNode)[]
}
> = ({ to = '' }, { slots }) => {
const router = useRouter()
const path = withBase(
resolvers.resolvePagePath(pagesMap.value, redirectsMap.value, to),
)

return h(
'a',
{
class: 'vp-link',
href: path,
onClick: (event: MouseEvent = {} as MouseEvent) => {
guardEvent(event) ? router.push(to).catch() : Promise.resolve()
},
},
slots.default?.(),
)
}

VPLink.displayName = 'VPLink'
1 change: 1 addition & 0 deletions packages/client/src/components/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export * from './ClientOnly.js'
export * from './Content.js'
export * from './VPLink.js'
2 changes: 1 addition & 1 deletion packages/client/src/composables/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export * from './pageHead.js'
export * from './pageHeadTitle.js'
export * from './pageLang.js'
export * from './pageLayout.js'
export * from './pagesData.js'
export * from './pagesMap.js'
export * from './routeLocale.js'
export * from './siteData.js'
export * from './siteLocaleData.js'
Expand Down
27 changes: 0 additions & 27 deletions packages/client/src/composables/pagesData.ts

This file was deleted.

47 changes: 47 additions & 0 deletions packages/client/src/composables/pagesMap.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import {
pagesMap as pagesMapRaw,
redirectsMap as redirectsMapRaw,
} from '@internal/pagesMap'
import type { PageRedirectsMap, PagesMap } from '@internal/pagesMap'
import { shallowRef } from 'vue'
import type { Ref } from 'vue'

/**
* Ref wrapper of `PagesMap`
*/
export type PagesMapRef = Ref<PagesMap>

/**
* Ref wrapper of `PageRedirectMap`
*/
export type PageRedirectsRef = Ref<PageRedirectsMap>

/**
* Global pages map ref
*/
export const pagesMap: PagesMapRef = shallowRef(pagesMapRaw)

/**
* Global pages map ref
*/
export const redirectsMap: PageRedirectsRef = shallowRef(redirectsMapRaw)

/**
* Returns the ref of pages map
*/
export const usePagesMap = (): PagesMapRef => pagesMap

/**
* Returns the ref of pages map
*/
export const useRedirectsMap = (): PageRedirectsRef => redirectsMap

if (__VUEPRESS_DEV__ && (import.meta.webpackHot || import.meta.hot)) {
// reuse vue HMR runtime
__VUE_HMR_RUNTIME__.updatePageRedirectsMap = (data: PageRedirectsMap) => {
redirectsMap.value = data
}
__VUE_HMR_RUNTIME__.updatePagesMap = (data: PagesMap) => {
pagesMap.value = data
}
}
40 changes: 35 additions & 5 deletions packages/client/src/resolvers.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import type { PageInfo, PageRedirectsMap, PagesMap } from '@internal/pagesMap'
import {
dedupeHead,
isArray,
isString,
normalizePath,
resolveLocalePath,
} from '@vuepress/shared'
import type { Component } from 'vue'
Expand All @@ -16,7 +18,7 @@ import type {
SiteData,
SiteLocaleData,
} from './composables/index.js'
import { pageDataEmpty, pagesData } from './composables/index.js'
import { pageDataEmpty } from './composables/index.js'
import { LAYOUT_NAME_DEFAULT, LAYOUT_NAME_NOT_FOUND } from './constants.js'
import type { ClientConfig, Layouts } from './types/index.js'

Expand All @@ -39,11 +41,39 @@ export const resolvers = reactive({
),

/**
* Resolve page data according to page key
* Resolve page info according to page path
*/
resolvePageData: async (pageKey: string): Promise<PageData> => {
const pageDataResolver = pagesData.value[pageKey]
const pageData = await pageDataResolver?.()
resolvePagePath: <PageMeta>(
pagesMap: PagesMap<PageMeta>,
redirectsMap: PageRedirectsMap,
path: string,
): string => {
path = normalizePath(path)

// original path
if (pagesMap.has(path)) return path

// encoded path
const encodedPath = encodeURI(path)
if (pagesMap.has(encodedPath)) return encodedPath

return (
// redirects
redirectsMap.get(path) ||
// if no match at this point, then we should leave the path as is
path
)
},

/**
* Resolve page data according to page path and page info
*/
resolvePageData: async (
pageInfo: PageInfo,
_path: string,
): Promise<PageData> => {
const pageData = await pageInfo?.data?.()

return pageData ?? pageDataEmpty
},

Expand Down
Loading

0 comments on commit 5771a39

Please sign in to comment.