Skip to content

Commit 38bbdad

Browse files
authored
feat: vitepress init command (#2020)
close #1252
1 parent 9c8f54c commit 38bbdad

22 files changed

+786
-6
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
.vscode
1111
dist
1212
cache
13+
temp
1314
examples-temp
1415
node_modules
1516
pnpm-global

.prettierignore

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
dist
44
pnpm-lock.yaml
55
cache
6+
template

__tests__/e2e/vitestGlobalSetup.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import getPort from 'get-port'
2-
import { Server } from 'net'
32
import { chromium, type BrowserServer } from 'playwright-chromium'
4-
import { type ViteDevServer } from 'vite'
53
import { build, createServer, serve } from 'vitepress'
4+
import type { ViteDevServer } from 'vite'
5+
import type { Server } from 'net'
66

77
let browserServer: BrowserServer
88
let server: ViteDevServer | Server

__tests__/init/init.test.ts

+98
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import { chromium, type Browser, type Page } from 'playwright-chromium'
2+
import { fileURLToPath } from 'url'
3+
import path from 'path'
4+
import fs from 'fs-extra'
5+
import {
6+
scaffold,
7+
build,
8+
createServer,
9+
serve,
10+
ScaffoldThemeType,
11+
type ScaffoldOptions
12+
} from 'vitepress'
13+
import type { ViteDevServer } from 'vite'
14+
import type { Server } from 'net'
15+
import getPort from 'get-port'
16+
17+
let browser: Browser
18+
let page: Page
19+
20+
beforeAll(async () => {
21+
browser = await chromium.connect(process.env['WS_ENDPOINT']!)
22+
page = await browser.newPage()
23+
})
24+
25+
afterAll(async () => {
26+
await page.close()
27+
await browser.close()
28+
})
29+
30+
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), 'temp')
31+
32+
async function testVariation(options: ScaffoldOptions) {
33+
fs.removeSync(root)
34+
scaffold({
35+
...options,
36+
root
37+
})
38+
39+
let server: ViteDevServer | Server
40+
const port = await getPort()
41+
42+
async function goto(path: string) {
43+
await page.goto(`http://localhost:${port}${path}`)
44+
await page.waitForSelector('#app div')
45+
}
46+
47+
if (process.env['VITE_TEST_BUILD']) {
48+
await build(root)
49+
server = (await serve({ root, port })).server
50+
} else {
51+
server = await createServer(root, { port })
52+
await server!.listen()
53+
}
54+
55+
try {
56+
await goto('/')
57+
expect(await page.textContent('h1')).toMatch('My Awesome Project')
58+
59+
await page.click('a[href="/markdown-examples.html"]')
60+
await page.waitForSelector('pre code')
61+
expect(await page.textContent('h1')).toMatch('Markdown Extension Examples')
62+
63+
await goto('/')
64+
expect(await page.textContent('h1')).toMatch('My Awesome Project')
65+
66+
await page.click('a[href="/api-examples.html"]')
67+
await page.waitForSelector('pre code')
68+
expect(await page.textContent('h1')).toMatch('Runtime API Examples')
69+
} finally {
70+
fs.removeSync(root)
71+
if ('ws' in server) {
72+
await server.close()
73+
} else {
74+
await new Promise<void>((resolve, reject) => {
75+
server.close((error) => (error ? reject(error) : resolve()))
76+
})
77+
}
78+
}
79+
}
80+
81+
const themes = [
82+
ScaffoldThemeType.Default,
83+
ScaffoldThemeType.DefaultCustom,
84+
ScaffoldThemeType.Custom
85+
]
86+
const usingTs = [false, true]
87+
88+
for (const theme of themes) {
89+
for (const useTs of usingTs) {
90+
test(`${theme}${useTs ? ` + TypeScript` : ``}`, () =>
91+
testVariation({
92+
root: '.',
93+
theme,
94+
useTs,
95+
injectNpmScripts: false
96+
}))
97+
}
98+
}

__tests__/init/package.json

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"private": true,
3+
"type": "module",
4+
"devDependencies": {
5+
"vitepress": "workspace:*"
6+
}
7+
}

__tests__/init/vitest.config.ts

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { dirname, resolve } from 'path'
2+
import { fileURLToPath } from 'url'
3+
import { defineConfig } from 'vitest/config'
4+
5+
const dir = dirname(fileURLToPath(import.meta.url))
6+
7+
const timeout = 60_000
8+
9+
export default defineConfig({
10+
resolve: {
11+
alias: {
12+
node: resolve(dir, '../../src/node')
13+
}
14+
},
15+
test: {
16+
watchExclude: ['**/node_modules/**', '**/temp/**'],
17+
globalSetup: ['__tests__/init/vitestGlobalSetup.ts'],
18+
testTimeout: timeout,
19+
hookTimeout: timeout,
20+
teardownTimeout: timeout,
21+
globals: true
22+
}
23+
})

__tests__/init/vitestGlobalSetup.ts

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { chromium, type BrowserServer } from 'playwright-chromium'
2+
3+
let browserServer: BrowserServer
4+
5+
export async function setup() {
6+
browserServer = await chromium.launchServer({
7+
headless: !process.env.DEBUG,
8+
args: process.env.CI
9+
? ['--no-sandbox', '--disable-setuid-sandbox']
10+
: undefined
11+
})
12+
process.env['WS_ENDPOINT'] = browserServer.wsEndpoint()
13+
}
14+
15+
export async function teardown() {
16+
await browserServer.close()
17+
}

package.json

+10-2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"bin",
3131
"dist",
3232
"types",
33+
"template",
3334
"client.d.ts",
3435
"theme.d.ts"
3536
],
@@ -62,10 +63,12 @@
6263
"format": "prettier --check --write .",
6364
"format-fail": "prettier --check .",
6465
"check": "run-s format-fail build test",
65-
"test": "run-p --aggregate-output test-unit test-preview test-build",
66+
"test": "run-p --aggregate-output test-unit test-preview test-build test-init",
6667
"test-unit": "vitest run -r __tests__/unit",
6768
"test-preview": "vitest run -r __tests__/e2e",
6869
"test-build": "VITE_TEST_BUILD=1 pnpm test-preview",
70+
"test-init": "vitest run -r __tests__/init",
71+
"test-init-build": "VITE_TEST_BUILD=1 pnpm test-init",
6972
"debug-preview": "DEBUG=1 vitest -r __tests__/e2e",
7073
"debug-build": "VITE_TEST_BUILD=1 pnpm debug-preview",
7174
"unit-dev": "vitest -r __tests__/unit",
@@ -77,7 +80,10 @@
7780
"docs-debug": "node --inspect-brk ./bin/vitepress dev docs",
7881
"docs-build": "run-s build docs-build-only",
7982
"docs-build-only": "node ./bin/vitepress build docs",
80-
"docs-preview": "node ./bin/vitepress preview docs"
83+
"docs-preview": "node ./bin/vitepress preview docs",
84+
"docs:dev": "vitepress dev /Users/evan/Vue/vitepress/__tests__/init/temp",
85+
"docs:build": "vitepress build /Users/evan/Vue/vitepress/__tests__/init/temp",
86+
"docs:preview": "vitepress preview /Users/evan/Vue/vitepress/__tests__/init/temp"
8187
},
8288
"dependencies": {
8389
"@docsearch/css": "^3.3.3",
@@ -91,6 +97,7 @@
9197
"vue": "^3.2.47"
9298
},
9399
"devDependencies": {
100+
"@clack/prompts": "^0.6.1",
94101
"@mdit-vue/plugin-component": "^0.12.0",
95102
"@mdit-vue/plugin-frontmatter": "^0.12.0",
96103
"@mdit-vue/plugin-headers": "^0.12.0",
@@ -132,6 +139,7 @@
132139
"fs-extra": "^11.1.0",
133140
"get-port": "^6.1.2",
134141
"lint-staged": "^13.1.2",
142+
"lodash.template": "^4.5.0",
135143
"lru-cache": "^7.17.0",
136144
"markdown-it": "^13.0.1",
137145
"markdown-it-anchor": "^8.6.7",

pnpm-lock.yaml

+44
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/node/cli.ts

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import minimist from 'minimist'
22
import c from 'picocolors'
33
import { createLogger } from 'vite'
44
import { build, createServer, serve } from '.'
5+
import { init } from './init/init'
56
import { version } from '../../package.json'
67

78
const argv: any = minimist(process.argv.slice(2))
@@ -48,6 +49,8 @@ if (!command || command === 'dev') {
4849
)
4950
process.exit(1)
5051
})
52+
} else if (command === 'init') {
53+
init()
5154
} else {
5255
createLogger().error(c.red(`unknown command "${command}".`))
5356
process.exit(1)

src/node/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export * from './server'
33
export * from './markdown'
44
export * from './build/build'
55
export * from './serve/serve'
6+
export * from './init/init'
67

78
// shared types
89
export type {

0 commit comments

Comments
 (0)