Skip to content

Commit 8962a00

Browse files
userquinKaelWD
andauthored
docs: optimize build (#20260)
Co-authored-by: Kael <kaelwd@gmail.com>
1 parent f20636a commit 8962a00

45 files changed

Lines changed: 2053 additions & 1349 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/actions/pnpm-install/action.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ runs:
1313
/home/runner/.cache/Cypress
1414
/home/runner/.pnpm-store
1515
key: pnpm-${{ runner.os }}-${{ hashFiles('./pnpm-lock.yaml') }}
16+
- uses: actions/setup-node@v4
17+
with:
18+
node-version-file: .nvmrc
1619
- uses: pnpm/action-setup@v4
1720
- run: pnpm i --frozen-lockfile
1821
shell: bash

.nvmrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
22.6.0

package.json

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,19 @@
2727
"vue-ecosystem-ci:test": "pnpm --filter vuetify run lint && pnpm --filter vuetify run test"
2828
},
2929
"engines": {
30-
"node": ">=18.20.0 || >=20.10.0"
30+
"node": ">=22.0.0"
3131
},
3232
"devDependencies": {
3333
"@babel/cli": "^7.24.8",
3434
"@babel/core": "^7.25.2",
3535
"@babel/preset-env": "^7.25.3",
3636
"@babel/preset-typescript": "^7.24.7",
37-
"@mdi/font": "6.2.95",
38-
"@mdi/js": "6.2.95",
39-
"@mdi/svg": "6.2.95",
37+
"@mdi/font": "7.4.47",
38+
"@mdi/js": "7.4.47",
39+
"@mdi/svg": "7.4.47",
4040
"@octokit/core": "^5.2.0",
41-
"@typescript-eslint/eslint-plugin": "^6.21.0",
42-
"@typescript-eslint/parser": "^6.21.0",
41+
"@typescript-eslint/eslint-plugin": "^7.18.0",
42+
"@typescript-eslint/parser": "^7.18.0",
4343
"@unhead/vue": "^1.9.4",
4444
"@vue/compiler-sfc": "^3.4.27",
4545
"@vue/runtime-core": "^3.4.27",
@@ -79,15 +79,20 @@
7979
"semver": "^7.6.0",
8080
"shelljs": "^0.8.5",
8181
"stringify-object": "^5.0.0",
82-
"typescript": "~5.3.3",
82+
"typescript": "~5.5.4",
8383
"upath": "^2.0.1",
8484
"vite-plugin-inspect": "^0.8.3",
8585
"vite-plugin-warmup": "^0.1.0",
8686
"vue": "^3.4.27",
8787
"vue-analytics": "^5.16.1",
8888
"vue-router": "^4.3.0",
89-
"vue-tsc": "^1.8.27",
89+
"vue-tsc": "^2.0.29",
9090
"yargs": "^17.7.2"
9191
},
92-
"packageManager": "pnpm@9.6.0"
92+
"packageManager": "pnpm@9.6.0",
93+
"pnpm": {
94+
"patchedDependencies": {
95+
"@mdi/js@7.4.47": "patches/@mdi__js@7.4.47.patch"
96+
}
97+
}
9398
}

packages/api-generator/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"vuetify": "workspace:*"
2121
},
2222
"devDependencies": {
23+
"@types/lodash-es": "^4.17.12",
2324
"@types/stringify-object": "^4.0.5",
2425
"eslint": "^8.57.0",
2526
"lodash-es": "^4.17.21",

packages/docs/auto-imports.d.ts

Lines changed: 162 additions & 3 deletions
Large diffs are not rendered by default.

packages/docs/build/api-plugin.ts

Lines changed: 16 additions & 151 deletions
Original file line numberDiff line numberDiff line change
@@ -1,163 +1,28 @@
11
// Imports
2-
import fs from 'fs'
3-
import path, { resolve } from 'path'
4-
import { createRequire } from 'module'
5-
import { startCase } from 'lodash-es'
6-
import locales from '../src/i18n/locales.json'
7-
import pageToApi from '../src/data/page-to-api.json'
2+
import fs from 'node:fs/promises'
3+
import path from 'node:path'
84
import type { Plugin } from 'vite'
9-
import { rimraf } from 'rimraf'
10-
import { mkdirp } from 'mkdirp'
115

12-
const API_ROOT = resolve('../api-generator/dist/api')
13-
const API_PAGES_ROOT = resolve('./node_modules/.cache/api-pages')
14-
15-
const require = createRequire(import.meta.url)
16-
17-
const sections = ['props', 'events', 'slots', 'exposed', 'sass', 'argument', 'modifiers', 'value'] as const
18-
// This can't be imported from the api-generator because it mixes the type definitions up
19-
type Data = {
20-
displayName: string // user visible name used in page titles
21-
fileName: string // file name for translation strings and generated types
22-
pathName: string // kebab-case name for use in urls
23-
} & Record<typeof sections[number], Record<string, any>>
24-
25-
const localeList = locales
26-
.filter(item => item.enabled)
27-
.map(item => item.alternate || item.locale)
28-
29-
function genApiLinks (componentName: string, header: string) {
30-
const section = ['<promoted-entry />', '<api-search />']
31-
const links = (Object.keys(pageToApi) as (keyof typeof pageToApi)[])
32-
.filter(page => pageToApi[page].includes(componentName))
33-
.reduce<string[]>((acc, href) => {
34-
const name = href.split('/')[1]
35-
acc.push(`- [${startCase(name)}](/${href})`)
36-
return acc
37-
}, [])
38-
39-
if (links.length && header) {
40-
section.unshift(...[links.join('\n'), `## ${header} {#links}`])
41-
}
42-
43-
return `${section.join('\n\n')}\n\n`
44-
}
45-
46-
function genFrontMatter (component: string) {
47-
const fm = [
48-
`title: ${component} API`,
49-
`description: API for the ${component} component.`,
50-
`keywords: ${component}, api, vuetify`,
51-
]
52-
53-
return `---\nmeta:\n${fm.map(s => ' ' + s).join('\n')}\n---`
54-
}
55-
56-
function genHeader (componentName: string) {
57-
const header = [
58-
genFrontMatter(componentName),
59-
`# ${componentName} API`,
60-
'<page-features />',
61-
]
62-
63-
return `${header.join('\n\n')}\n\n`
64-
}
65-
66-
const sanitize = (str: string) => str.replace(/\$/g, '')
67-
68-
async function loadMessages (locale: string) {
69-
const prefix = path.resolve('./src/i18n/messages/')
70-
const fallback = require(path.join(prefix, 'en.json'))
71-
72-
try {
73-
const messages = require(path.join(prefix, `${locale}.json`))
74-
75-
return {
76-
...fallback['api-headers'],
77-
...(messages['api-headers'] || {}),
78-
}
79-
} catch (err) {
80-
return fallback['api-headers']
81-
}
82-
}
83-
84-
async function createMdFile (component: Data, locale: string) {
85-
const messages = await loadMessages(locale)
86-
let str = ''
87-
88-
str += genHeader(component.displayName)
89-
str += genApiLinks(component.displayName, messages.links)
90-
91-
for (const section of sections) {
92-
if (Object.keys(component[section] ?? {}).length) {
93-
str += `## ${messages[section]} {#${section}}\n\n`
94-
str += `<api-section name="${component.fileName}" section="${section}" />\n\n`
95-
}
96-
}
97-
98-
return str
99-
}
100-
101-
async function writeFile (componentApi: Data, locale: string) {
102-
if (!componentApi?.fileName) return
103-
104-
const folder = resolve(API_PAGES_ROOT, locale, 'api')
105-
106-
if (!fs.existsSync(folder)) {
107-
fs.mkdirSync(folder, { recursive: true })
108-
}
109-
110-
fs.writeFileSync(resolve(folder, `${sanitize(componentApi.pathName)}.md`), await createMdFile(componentApi, locale))
111-
}
112-
113-
function getApiData () {
114-
const files = fs.readdirSync(API_ROOT)
115-
const data: Data[] = []
116-
117-
for (const file of files) {
118-
const obj = JSON.parse(fs.readFileSync(resolve(API_ROOT, file), 'utf-8'))
119-
120-
data.push(obj)
121-
}
122-
123-
return data
124-
}
125-
126-
async function generateFiles () {
127-
// const api: Record<string, any>[] = getCompleteApi(localeList)
128-
const api = getApiData()
129-
130-
for (const locale of localeList) {
131-
// const pages = {} as Record<string, any>
132-
133-
for (const item of api) {
134-
await writeFile(item, locale)
135-
136-
// pages[`/${locale}/api/${sanitize(kebabCase(item.name))}/`] = item.name
137-
}
138-
139-
// fs.writeFileSync(resolve(API_PAGES_ROOT, `${locale}/pages.json`), JSON.stringify(pages, null, 2))
140-
fs.writeFileSync(resolve(API_PAGES_ROOT, `${locale}.js`), `export default require.context('./${locale}/api', true, /\\.md$/)`)
141-
}
142-
143-
// for (const item of api) {
144-
// writeData(item.name, item)
145-
// }
146-
147-
// fs.writeFileSync(resolve(API_PAGES_ROOT, 'sass.json'), JSON.stringify([
148-
// ...api.filter(item => item && item.sass && item.sass.length > 0).map(item => item.name),
149-
// ]))
150-
}
6+
const API_ROOT = path.resolve('../api-generator/dist/api')
1517

1528
export default function Api (): Plugin {
1539
return {
15410
name: 'vuetify:api',
15511
enforce: 'pre',
156-
async config () {
157-
await rimraf(API_PAGES_ROOT)
158-
await mkdirp(API_PAGES_ROOT)
12+
resolveId (id) {
13+
return id === 'virtual:api-list' ? '\0' + id : undefined
14+
},
15+
async load (id) {
16+
if (id === '\0virtual:api-list') {
17+
const files = await fs.readdir(API_ROOT)
18+
19+
const names = files
20+
.sort((a, b) => a.localeCompare(b))
21+
.map(file => `'${file.split('.')[0]}'`)
22+
.join(', ')
15923

160-
await generateFiles()
24+
return `export default [${names}]`
25+
}
16126
},
16227
}
16328
}

0 commit comments

Comments
 (0)