Skip to content

Commit

Permalink
Merge 880ccba into 49f6f48
Browse files Browse the repository at this point in the history
  • Loading branch information
Mister-Hope committed Jan 24, 2024
2 parents 49f6f48 + 880ccba commit 5126143
Show file tree
Hide file tree
Showing 54 changed files with 683 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
---
13 changes: 13 additions & 0 deletions e2e/docs/routes/get-pages-path.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
## GetPagesPath

<ul>
<li v-for="path in pagesPath">
{{path}}
</li>
</ul>

<script setup>
import { getPagesPath } from 'vuepress/client'

const pagesPath = getPagesPath();
</script>
18 changes: 18 additions & 0 deletions e2e/docs/routes/is-page-exist.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# isPageExist

- /: {{isPageExist('/')}}
- /README.md: {{isPageExist('/README.md')}}
- /index.html: {{isPageExist('/index.html')}}
- /not-exist: {{isPageExist('/not-exist')}}
- /not-exist.html: {{isPageExist('/not-exist.html')}}
- /not-exist.md: {{isPageExist('/not-exist.md')}}
- /routes/non-ascii-paths/中文目录名/中文文件名.md: {{isPageExist('/routes/non-ascii-paths/中文目录名/中文文件名.md')}}
- /routes/non-ascii-paths/中文目录名/中文文件名.html: {{isPageExist('/routes/non-ascii-paths/中文目录名/中文文件名.html')}}
- {{encodeURI('/routes/non-ascii-paths/中文目录名/中文文件名.md')}}: {{isPageExist(encodeURI('/routes/non-ascii-paths/中文目录名/中文文件名.md'))}}
- {{encodeURI('/routes/non-ascii-paths/中文目录名/中文文件名.html')}}: {{isPageExist(encodeURI('/routes/non-ascii-paths/中文目录名/中文文件名.html'))}}
- /zh/: {{isPageExist('/zh/')}}
- /zh: {{isPageExist('/zh')}}

<script setup>
import { isPageExist } from 'vuepress/client'
</script>
9 changes: 9 additions & 0 deletions e2e/docs/routes/resolve.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
## resolve

- Clean url: {{JSON.stringify(resolve('/page-data/meta'))}}
- HTML: {{JSON.stringify(resolve('/page-data/meta.html'))}}
- Markdown: {{JSON.stringify(resolve('/page-data/meta.md'))}}

<script setup>
import { resolve } from 'vuepress/client'
</script>
45 changes: 45 additions & 0 deletions e2e/tests/routes/get-pages-path.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
it('getPagesPath', () => {
cy.visit('/routes/get-pages-path.html')

const paths = [
'/',
// '/layouts/custom-layout.html',
// '/layouts/layout.html',
// '/markdown/anchors.html',
// '/markdown/code-blocks.html',
// '/markdown/emoji.html',
// '/markdown/import-code-blocks.html',
// '/markdown/links/bar.html',
// '/markdown/links/baz.html',
// '/markdown/links/foo.html',
// '/markdown/toc.html',
// '/markdown/vue-components.html',
// '/page-data/frontmatter.html',
// '/page-data/headers.html',
// '/page-data/lang.html',
// '/page-data/meta.html',
// '/page-data/permalink.html',
// '/page-data/title-from-frontmatter.html',
// '/page-data/title-from-h1.html',
// '/routes/non-ascii-paths/',
// '/routes/non-ascii-paths/%E4%B8%AD%E6%96%87%E7%9B%AE%E5%BD%95%E5%90%8D/%E4%B8%AD%E6%96%87%E6%96%87%E4%BB%B6%E5%90%8D.html',
// '/routes/get-pages-path.html',
// '/routes/resolve.html',
// '/routes/is-page-exist.html',
// '/zh/',
// '/404.html',
]

const pagePaths: string[] = []

// eslint-disable-next-line cypress/unsafe-to-chain-command
cy.get('.e2e-theme-content ul li')
.each((el) => {
pagePaths.push(el.text())
})
.then(() => {
paths.forEach((path) => {
expect(pagePaths.includes(path)).to.equal(true)
})
})
})
22 changes: 22 additions & 0 deletions e2e/tests/routes/is-page-exisit.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
it('isPageExist', () => {
cy.visit('/routes/is-page-exist.html')

const results = [
'/: true',
'/README.md: true',
'/index.html: true',
'/not-exist: false',
'/not-exist.html: false',
'/not-exist.md: false',
'/routes/non-ascii-paths/中文目录名/中文文件名.md: true',
'/routes/non-ascii-paths/中文目录名/中文文件名.html: true',
`${encodeURI('/routes/non-ascii-paths/中文目录名/中文文件名.md')}: true`,
`${encodeURI('/routes/non-ascii-paths/中文目录名/中文文件名.html')}: true`,
'/zh/: true',
'/zh: false',
]

cy.get('.e2e-theme-content ul li').each((el) => {
expect(results.includes(el.text())).to.equal(true)
})
})
10 changes: 10 additions & 0 deletions e2e/tests/routes/resolve.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
it('resolve', () => {
cy.visit('/routes/resolve.html')
const result = { path: '/page-data/meta.html', meta: { a: 0, b: 2, c: 3 } }

cy.get('.e2e-theme-content ul li').each((el) => {
expect(JSON.parse(/: (\{.*\})\s*$/.exec(el.text())![1])).to.deep.include(
result,
)
})
})
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
52 changes: 52 additions & 0 deletions packages/client/src/components/VPLink.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { h } from 'vue'
import type { FunctionalComponent, VNode } from 'vue'
import { useRouter } from 'vue-router'
import { resolve, withBase } from '../helpers/index.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
}

export 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(resolve(to).path)

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
}
}
Loading

0 comments on commit 5126143

Please sign in to comment.