mirror of https://github.com/vuejs/vitepress
commit
8c8c2910db
@ -0,0 +1,69 @@
|
||||
import { ref } from 'vue'
|
||||
import type { VitePressData } from 'vitepress'
|
||||
import type { DefaultTheme } from 'vitepress/theme'
|
||||
import { resolveLocaleLink } from 'client/theme-default/composables/langs'
|
||||
|
||||
function createData(
|
||||
themeConfig: DefaultTheme.Config,
|
||||
relativePath = 'guide/getting-started.md',
|
||||
cleanUrls = false,
|
||||
hash = '#install'
|
||||
) {
|
||||
return {
|
||||
site: ref({
|
||||
cleanUrls,
|
||||
locales: {
|
||||
root: { label: 'English', lang: 'en-US' },
|
||||
fr: { label: 'Français', lang: 'fr-FR', link: '/fr/' }
|
||||
},
|
||||
themeConfig
|
||||
}),
|
||||
page: ref({ relativePath }),
|
||||
theme: ref(themeConfig),
|
||||
hash: ref(hash)
|
||||
} as unknown as VitePressData<DefaultTheme.Config>
|
||||
}
|
||||
|
||||
describe('client/theme-default/composables/langs', () => {
|
||||
test('resolves corresponding links with the default router', () => {
|
||||
expect(resolveLocaleLink(createData({}), 'fr', '/fr/', '/', true)).toBe(
|
||||
'/fr/guide/getting-started.html#install'
|
||||
)
|
||||
})
|
||||
|
||||
test('resolves clean index links with the default router', () => {
|
||||
expect(
|
||||
resolveLocaleLink(
|
||||
createData({}, 'en/guide/index.md', true, '#intro'),
|
||||
'fr',
|
||||
'/fr/',
|
||||
'/en/',
|
||||
true
|
||||
)
|
||||
).toBe('/fr/guide/#intro')
|
||||
})
|
||||
|
||||
test('keeps locale root links when i18n routing is disabled', () => {
|
||||
expect(
|
||||
resolveLocaleLink(
|
||||
createData({ i18nRouting: false }),
|
||||
'fr',
|
||||
'/fr/',
|
||||
'/',
|
||||
true
|
||||
)
|
||||
).toBe('/fr/#install')
|
||||
})
|
||||
|
||||
test('uses custom i18n routing functions for corresponding links', () => {
|
||||
const data = createData({
|
||||
i18nRouting(data, hash, targetLocale) {
|
||||
return `${data.site.value.locales[targetLocale].link}mapped/${data.page.value.relativePath}${hash}`
|
||||
}
|
||||
})
|
||||
|
||||
expect(resolveLocaleLink(data, 'fr', '/fr/', '/', true)).toBe(
|
||||
'/fr/mapped/guide/getting-started.md#install'
|
||||
)
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,39 @@
|
||||
import { mergeConfig } from 'node/config'
|
||||
import type { MarkdownItAsync } from 'markdown-it-async'
|
||||
|
||||
describe('node/config', () => {
|
||||
test('merges markdown config hooks from extended configs', async () => {
|
||||
const calls: string[] = []
|
||||
const md = {} as MarkdownItAsync
|
||||
|
||||
const merged = mergeConfig(
|
||||
{
|
||||
markdown: {
|
||||
lineNumbers: true,
|
||||
config() {
|
||||
calls.push('base')
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
markdown: {
|
||||
attrs: {
|
||||
allowedAttributes: ['id']
|
||||
},
|
||||
async config() {
|
||||
calls.push('extended')
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
expect(merged.markdown?.lineNumbers).toBe(true)
|
||||
expect(merged.markdown?.attrs).toEqual({
|
||||
allowedAttributes: ['id']
|
||||
})
|
||||
|
||||
await merged.markdown?.config?.(md)
|
||||
|
||||
expect(calls).toEqual(['base', 'extended'])
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,69 @@
|
||||
import { mkdtemp, rm, writeFile } from 'node:fs/promises'
|
||||
import { tmpdir } from 'node:os'
|
||||
import path from 'node:path'
|
||||
import { resolveConfig } from 'node/config'
|
||||
import { createMarkdownToVueRenderFn } from 'node/markdownToVue'
|
||||
|
||||
describe('node/markdownToVue', () => {
|
||||
let root: string | undefined
|
||||
|
||||
afterEach(async () => {
|
||||
if (root) {
|
||||
await rm(root, { recursive: true, force: true })
|
||||
root = undefined
|
||||
}
|
||||
})
|
||||
|
||||
test('records source line numbers for dead links', async () => {
|
||||
root = await mkdtemp(path.join(tmpdir(), 'vitepress-dead-link-'))
|
||||
|
||||
const file = path.join(root, 'index.md')
|
||||
const src = '# Home\n\nIntro\n\n[Missing](./missing.md)\n'
|
||||
await writeFile(file, src)
|
||||
|
||||
const siteConfig = await resolveConfig(root, 'build', 'production')
|
||||
const render = await createMarkdownToVueRenderFn(
|
||||
siteConfig.srcDir,
|
||||
{ cache: false },
|
||||
'/',
|
||||
false,
|
||||
false,
|
||||
siteConfig
|
||||
)
|
||||
|
||||
const result = await render(src, file, 'public')
|
||||
|
||||
expect(result.deadLinks).toContainEqual({
|
||||
url: './missing',
|
||||
file,
|
||||
line: 5
|
||||
})
|
||||
})
|
||||
|
||||
test('records source line numbers after frontmatter', async () => {
|
||||
root = await mkdtemp(path.join(tmpdir(), 'vitepress-dead-link-'))
|
||||
|
||||
const file = path.join(root, 'index.md')
|
||||
const src =
|
||||
'---\ntitle: Home\n---\n# Home\n\nIntro\n\n[Missing](./missing.md)\n'
|
||||
await writeFile(file, src)
|
||||
|
||||
const siteConfig = await resolveConfig(root, 'build', 'production')
|
||||
const render = await createMarkdownToVueRenderFn(
|
||||
siteConfig.srcDir,
|
||||
{ cache: false },
|
||||
'/',
|
||||
false,
|
||||
false,
|
||||
siteConfig
|
||||
)
|
||||
|
||||
const result = await render(src, file, 'public')
|
||||
|
||||
expect(result.deadLinks).toContainEqual({
|
||||
url: './missing',
|
||||
file,
|
||||
line: 8
|
||||
})
|
||||
})
|
||||
})
|
||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue