From 758180d9f53f2a1645c6088f13dd7d5198ccabdb Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Thu, 23 Jan 2025 05:08:39 +0800 Subject: [PATCH] feat: use `markdown-it-async` --- CHANGELOG.md | 6 ---- __tests__/e2e/.vitepress/config.ts | 4 +-- docs/en/reference/default-theme-search.md | 16 +++++----- docs/es/reference/default-theme-search.md | 16 +++++----- docs/fa/reference/default-theme-search.md | 18 +++++------ docs/ko/reference/default-theme-search.md | 16 +++++----- docs/pt/reference/default-theme-search.md | 16 +++++----- docs/ru/reference/default-theme-search.md | 16 +++++----- docs/zh/reference/default-theme-search.md | 16 +++++----- package.json | 3 +- pnpm-lock.yaml | 29 +++++++----------- rollup.config.ts | 12 ++++---- .../components/VPAlgoliaSearchBox.vue | 26 ++++++++++++++-- src/node/contentLoader.ts | 4 +-- src/node/markdown/markdown.ts | 10 +++---- src/node/markdown/plugins/highlight.ts | 30 +++++-------------- src/node/markdownToVue.ts | 2 +- src/node/plugins/localSearchPlugin.ts | 7 +++-- src/node/worker_shikiResolveLang.ts | 23 -------------- types/default-theme.d.ts | 3 +- 20 files changed, 122 insertions(+), 151 deletions(-) delete mode 100644 src/node/worker_shikiResolveLang.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 99edf822..ae7354e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,6 @@ - upgrade vite to v6 ([#4504](https://github.com/vuejs/vitepress/issues/4504)) ([6a2efc3](https://github.com/vuejs/vitepress/commit/6a2efc385c90b088241db05f5263b2f3e1f757cf)) -## [1.6.3](https://github.com/vuejs/vitepress/compare/v1.6.2...v1.6.3) (2025-01-22) - -### Bug Fixes - -- docsearch not rendering properly ([3e4120e](https://github.com/vuejs/vitepress/commit/3e4120e94805156bf63587fd633162433dbaf260)) - ## [1.6.2](https://github.com/vuejs/vitepress/compare/v1.6.1...v1.6.2) (2025-01-22) ### Bug Fixes diff --git a/__tests__/e2e/.vitepress/config.ts b/__tests__/e2e/.vitepress/config.ts index 65f845ab..43dbfa84 100644 --- a/__tests__/e2e/.vitepress/config.ts +++ b/__tests__/e2e/.vitepress/config.ts @@ -165,8 +165,8 @@ export default defineConfig({ search: { provider: 'local', options: { - _render(src, env, md) { - const html = md.render(src, env) + async _render(src, env, md) { + const html = await md.renderAsync(src, env) if (env.frontmatter?.search === false) return '' if (env.relativePath.startsWith('local-search/excluded')) return '' return html diff --git a/docs/en/reference/default-theme-search.md b/docs/en/reference/default-theme-search.md index 16bb9289..73ef93fb 100644 --- a/docs/en/reference/default-theme-search.md +++ b/docs/en/reference/default-theme-search.md @@ -124,9 +124,9 @@ export default defineConfig({ /** * @param {string} src * @param {import('vitepress').MarkdownEnv} env - * @param {import('markdown-it')} md + * @param {import('markdown-it-async')} md */ - _render(src, env, md) { + async _render(src, env, md) { // return html string } } @@ -149,8 +149,8 @@ export default defineConfig({ search: { provider: 'local', options: { - _render(src, env, md) { - const html = md.render(src, env) + async _render(src, env, md) { + const html = await md.renderAsync(src, env) if (env.frontmatter?.search === false) return '' if (env.relativePath.startsWith('some/path')) return '' return html @@ -162,7 +162,7 @@ export default defineConfig({ ``` ::: warning Note -In case a custom `_render` function is provided, you need to handle the `search: false` frontmatter yourself. Also, the `env` object won't be completely populated before `md.render` is called, so any checks on optional `env` properties like `frontmatter` should be done after that. +In case a custom `_render` function is provided, you need to handle the `search: false` frontmatter yourself. Also, the `env` object won't be completely populated before `md.renderAsync` is called, so any checks on optional `env` properties like `frontmatter` should be done after that. ::: #### Example: Transforming content - adding anchors @@ -175,10 +175,10 @@ export default defineConfig({ search: { provider: 'local', options: { - _render(src, env, md) { - const html = md.render(src, env) + async _render(src, env, md) { + const html = await md.renderAsync(src, env) if (env.frontmatter?.title) - return md.render(`# ${env.frontmatter.title}`) + html + return await md.renderAsync(`# ${env.frontmatter.title}`) + html return html } } diff --git a/docs/es/reference/default-theme-search.md b/docs/es/reference/default-theme-search.md index 5a654705..9815721a 100644 --- a/docs/es/reference/default-theme-search.md +++ b/docs/es/reference/default-theme-search.md @@ -113,9 +113,9 @@ export default defineConfig({ /** * @param {string} src * @param {import('vitepress').MarkdownEnv} env - * @param {import('markdown-it')} md + * @param {import('markdown-it-async')} md */ - _render(src, env, md) { + async _render(src, env, md) { // retorne un string HTML } } @@ -138,8 +138,8 @@ export default defineConfig({ search: { provider: 'local', options: { - _render(src, env, md) { - const html = md.render(src, env) + async _render(src, env, md) { + const html = await md.renderAsync(src, env) if (env.frontmatter?.search === false) return '' if (env.relativePath.startsWith('algum/caminho')) return '' return html @@ -151,7 +151,7 @@ export default defineConfig({ ``` ::: warning Nota -En este caso, una función `_render` se proporciona, es necesario manipular el `search: false` desde el frente por su cuenta. Además, el objeto `env` no estará completamente poblado antes que `md.render` se llama, luego verifica las propiedades opcionales `env`, como `frontmatter`, debe hacerse después de eso. +En este caso, una función `_render` se proporciona, es necesario manipular el `search: false` desde el frente por su cuenta. Además, el objeto `env` no estará completamente poblado antes que `md.renderAsync` se llama, luego verifica las propiedades opcionales `env`, como `frontmatter`, debe hacerse después de eso. ::: #### Ejemplo: Transformar contenido - agregar anclajes {#example-transforming-content-adding-anchors} @@ -164,10 +164,10 @@ export default defineConfig({ search: { provider: 'local', options: { - _render(src, env, md) { - const html = md.render(src, env) + async _render(src, env, md) { + const html = await md.renderAsync(src, env) if (env.frontmatter?.title) - return md.render(`# ${env.frontmatter.title}`) + html + return await md.renderAsync(`# ${env.frontmatter.title}`) + html return html } } diff --git a/docs/fa/reference/default-theme-search.md b/docs/fa/reference/default-theme-search.md index dd325c9f..8ad599e5 100644 --- a/docs/fa/reference/default-theme-search.md +++ b/docs/fa/reference/default-theme-search.md @@ -120,9 +120,9 @@ export default defineConfig({ /** * @param {string} src * @param {import('vitepress').MarkdownEnv} env - * @param {import('markdown-it')} md + * @param {import('markdown-it-async')} md */ - _render(src, env, md) { + async _render(src, env, md) { // بازگشت رشته HTML } } @@ -145,8 +145,8 @@ export default defineConfig({ search: { provider: 'local', options: { - _render(src, env, md) { - const html = md.render(src, env) + async _render(src, env, md) { + const html = await md.renderAsync(src, env) if (env.frontmatter?.search === false) return '' if (env.relativePath.startsWith('some/path')) return '' return html @@ -158,7 +158,7 @@ export default defineConfig({ ``` ::: warning توجه -در صورت ارائه تابع `_render` سفارشی، باید خودتان بررسی کنید که آیا frontmatter `search: false` را مدیریت می‌کند یا خیر. همچنین، شی env قبل از فراخوانی `md.render` کاملاً پر نمی‌شود، بنابراین هر بررسی‌ای روی ویژگی‌های اختیاری env مانند `frontmatter` باید بعد از آن انجام شود. +در صورت ارائه تابع `_render` سفارشی، باید خودتان بررسی کنید که آیا frontmatter `search: false` را مدیریت می‌کند یا خیر. همچنین، شی env قبل از فراخوانی `md.renderAsync` کاملاً پر نمی‌شود، بنابراین هر بررسی‌ای روی ویژگی‌های اختیاری env مانند `frontmatter` باید بعد از آن انجام شود. ::: #### مثال: تبدیل محتوا - افزودن لینک‌های صفحه {#example-transforming-content-adding-anchors} @@ -171,10 +171,10 @@ export default defineConfig({ search: { provider: 'local', options: { - _render(src, env, md) { - const html = md.render(src, env) + async _render(src, env, md) { + const html = await md.renderAsync(src, env) if (env.frontmatter?.title) - return md.render(`# ${env.frontmatter.title}`) + html + return await md.renderAsync(`# ${env.frontmatter.title}`) + html return html } } @@ -383,4 +383,4 @@ img[src="/search.png"] { width: 100%; aspect-ratio: 1 / 1; } - \ No newline at end of file + diff --git a/docs/ko/reference/default-theme-search.md b/docs/ko/reference/default-theme-search.md index da1feb42..ea7fb682 100644 --- a/docs/ko/reference/default-theme-search.md +++ b/docs/ko/reference/default-theme-search.md @@ -120,9 +120,9 @@ export default defineConfig({ /** * @param {string} src * @param {import('vitepress').MarkdownEnv} env - * @param {import('markdown-it')} md + * @param {import('markdown-it-async')} md */ - _render(src, env, md) { + async _render(src, env, md) { // return html string } } @@ -145,8 +145,8 @@ export default defineConfig({ search: { provider: 'local', options: { - _render(src, env, md) { - const html = md.render(src, env) + async _render(src, env, md) { + const html = await md.renderAsync(src, env) if (env.frontmatter?.search === false) return '' if (env.relativePath.startsWith('some/path')) return '' return html @@ -158,7 +158,7 @@ export default defineConfig({ ``` ::: warning 참고 -커스텀 `_render` 함수가 제공된 경우, `search: false` 전문을 직접 처리해야 합니다. 또한, `md.render`가 호출되기 전에 `env` 객체가 완전히 채워지지 않으므로, `frontmatter`와 같은 선택적 `env` 프로퍼티에 대한 검사는 그 이후에 수행해야 합니다. +커스텀 `_render` 함수가 제공된 경우, `search: false` 전문을 직접 처리해야 합니다. 또한, `md.renderAsync`가 호출되기 전에 `env` 객체가 완전히 채워지지 않으므로, `frontmatter`와 같은 선택적 `env` 프로퍼티에 대한 검사는 그 이후에 수행해야 합니다. ::: #### 예제: 콘텐츠 변환 - 앵커 추가 {#example-transforming-content-adding-anchors} @@ -171,10 +171,10 @@ export default defineConfig({ search: { provider: 'local', options: { - _render(src, env, md) { - const html = md.render(src, env) + async _render(src, env, md) { + const html = await md.renderAsync(src, env) if (env.frontmatter?.title) - return md.render(`# ${env.frontmatter.title}`) + html + return await md.renderAsync(`# ${env.frontmatter.title}`) + html return html } } diff --git a/docs/pt/reference/default-theme-search.md b/docs/pt/reference/default-theme-search.md index e7347afa..086bfabc 100644 --- a/docs/pt/reference/default-theme-search.md +++ b/docs/pt/reference/default-theme-search.md @@ -113,9 +113,9 @@ export default defineConfig({ /** * @param {string} src * @param {import('vitepress').MarkdownEnv} env - * @param {import('markdown-it')} md + * @param {import('markdown-it-async')} md */ - _render(src, env, md) { + async _render(src, env, md) { // retorne a string HTML } } @@ -138,8 +138,8 @@ export default defineConfig({ search: { provider: 'local', options: { - _render(src, env, md) { - const html = md.render(src, env) + async _render(src, env, md) { + const html = await md.renderAsync(src, env) if (env.frontmatter?.search === false) return '' if (env.relativePath.startsWith('algum/caminho')) return '' return html @@ -151,7 +151,7 @@ export default defineConfig({ ``` ::: warning Nota -No caso uma função `_render` personalizada ser fornecida, você precisa manipular o `search: false` do frontmatter por conta própria. Além disso, o objeto `env` não estará completamente populado antes que `md.render` seja chamado, então verificações em propriedades opcionais `env`, como `frontmatter`, devem ser feitas após isso. +No caso uma função `_render` personalizada ser fornecida, você precisa manipular o `search: false` do frontmatter por conta própria. Além disso, o objeto `env` não estará completamente populado antes que `md.renderAsync` seja chamado, então verificações em propriedades opcionais `env`, como `frontmatter`, devem ser feitas após isso. ::: #### Exemplo: Transformando conteúdo - adicionando âncoras {#example-transforming-content-adding-anchors} @@ -164,10 +164,10 @@ export default defineConfig({ search: { provider: 'local', options: { - _render(src, env, md) { - const html = md.render(src, env) + async _render(src, env, md) { + const html = await md.renderAsync(src, env) if (env.frontmatter?.title) - return md.render(`# ${env.frontmatter.title}`) + html + return await md.renderAsync(`# ${env.frontmatter.title}`) + html return html } } diff --git a/docs/ru/reference/default-theme-search.md b/docs/ru/reference/default-theme-search.md index c91e4be4..3345138f 100644 --- a/docs/ru/reference/default-theme-search.md +++ b/docs/ru/reference/default-theme-search.md @@ -124,9 +124,9 @@ export default defineConfig({ /** * @param {string} src * @param {import('vitepress').MarkdownEnv} env - * @param {import('markdown-it')} md + * @param {import('markdown-it-async')} md */ - _render(src, env, md) { + async _render(src, env, md) { // возвращаем html } } @@ -149,8 +149,8 @@ export default defineConfig({ search: { provider: 'local', options: { - _render(src, env, md) { - const html = md.render(src, env) + async _render(src, env, md) { + const html = await md.renderAsync(src, env) if (env.frontmatter?.search === false) return '' if (env.relativePath.startsWith('some/path')) return '' return html @@ -162,7 +162,7 @@ export default defineConfig({ ``` ::: warning ПРИМЕЧАНИЕ -В случае, если предоставляется пользовательская функция `_render`, вам нужно самостоятельно обработать заголовок `search: false`. Кроме того, объект `env` не будет полностью заполнен до вызова `md.render`, поэтому любые проверки необязательных свойств `env`, таких как `frontmatter`, должны быть выполнены после этого. +В случае, если предоставляется пользовательская функция `_render`, вам нужно самостоятельно обработать заголовок `search: false`. Кроме того, объект `env` не будет полностью заполнен до вызова `md.renderAsync`, поэтому любые проверки необязательных свойств `env`, таких как `frontmatter`, должны быть выполнены после этого. ::: #### Пример: Преобразование содержимого - добавление якорей {#example-transforming-content-adding-anchors} @@ -175,10 +175,10 @@ export default defineConfig({ search: { provider: 'local', options: { - _render(src, env, md) { - const html = md.render(src, env) + async _render(src, env, md) { + const html = await md.renderAsync(src, env) if (env.frontmatter?.title) - return md.render(`# ${env.frontmatter.title}`) + html + return await md.renderAsync(`# ${env.frontmatter.title}`) + html return html } } diff --git a/docs/zh/reference/default-theme-search.md b/docs/zh/reference/default-theme-search.md index e19f052a..348e0a6b 100644 --- a/docs/zh/reference/default-theme-search.md +++ b/docs/zh/reference/default-theme-search.md @@ -113,9 +113,9 @@ export default defineConfig({ /** * @param {string} src * @param {import('vitepress').MarkdownEnv} env - * @param {import('markdown-it')} md + * @param {import('markdown-it-async')} md */ - _render(src, env, md) { + async _render(src, env, md) { // 返回 html 字符串 } } @@ -138,8 +138,8 @@ export default defineConfig({ search: { provider: 'local', options: { - _render(src, env, md) { - const html = md.render(src, env) + async _render(src, env, md) { + const html = await md.renderAsync(src, env) if (env.frontmatter?.search === false) return '' if (env.relativePath.startsWith('some/path')) return '' return html @@ -151,7 +151,7 @@ export default defineConfig({ ``` ::: warning 注意 -如果提供了自定义的 `_render` 函数,你需要自己处理 `search: false` 的 frontmatter。此外,在调用 `md.render` 之前,`env` 对象不会完全填充,因此对可选 `env` 属性 (如 `frontmatter`) 的任何检查都应该在此之后完成。 +如果提供了自定义的 `_render` 函数,你需要自己处理 `search: false` 的 frontmatter。此外,在调用 `md.renderAsync` 之前,`env` 对象不会完全填充,因此对可选 `env` 属性 (如 `frontmatter`) 的任何检查都应该在此之后完成。 ::: #### 示例:转换内容——添加锚点 {#example-transforming-content-adding-anchors} @@ -164,10 +164,10 @@ export default defineConfig({ search: { provider: 'local', options: { - _render(src, env, md) { - const html = md.render(src, env) + async _render(src, env, md) { + const html = await md.renderAsync(src, env) if (env.frontmatter?.title) - return md.render(`# ${env.frontmatter.title}`) + html + return await md.renderAsync(`# ${env.frontmatter.title}`) + html return html } } diff --git a/package.json b/package.json index 167ffb98..2ebf81bb 100644 --- a/package.json +++ b/package.json @@ -135,6 +135,7 @@ "@types/fs-extra": "^11.0.4", "@types/lodash.template": "^4.5.3", "@types/mark.js": "^8.11.12", + "@types/markdown-it": "^14.1.2", "@types/markdown-it-attrs": "^4.1.3", "@types/markdown-it-container": "^2.0.10", "@types/markdown-it-emoji": "^3.0.1", @@ -156,6 +157,7 @@ "lodash.template": "^4.5.0", "lru-cache": "^11.0.2", "markdown-it": "^14.1.0", + "markdown-it-async": "^2.0.0", "markdown-it-anchor": "^9.2.0", "markdown-it-attrs": "^4.3.1", "markdown-it-container": "^4.0.0", @@ -183,7 +185,6 @@ "simple-git-hooks": "^2.11.1", "sirv": "^3.0.0", "sitemap": "^8.0.0", - "synckit": "^0.9.2", "tinyglobby": "^0.2.10", "typescript": "^5.7.3", "vitest": "^3.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 33fc3990..2cbd66c2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -197,6 +197,9 @@ importers: markdown-it-anchor: specifier: ^9.2.0 version: 9.2.0(@types/markdown-it@14.1.2)(markdown-it@14.1.0) + markdown-it-async: + specifier: ^2.0.0 + version: 2.0.0 markdown-it-attrs: specifier: ^4.3.1 version: 4.3.1(markdown-it@14.1.0) @@ -275,9 +278,6 @@ importers: sitemap: specifier: ^8.0.0 version: 8.0.0 - synckit: - specifier: ^0.9.2 - version: 0.9.2 tinyglobby: specifier: ^0.2.10 version: 0.2.10 @@ -701,10 +701,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@polka/compression@1.0.0-next.28': resolution: {integrity: sha512-aDmrBhgHJtxE+jy145WfhW9WmTAFmES/dNnn1LAs8UnnkFgBUj4T8I4ScQ9+rOkpDZStvnVP5iqhN3tvt7O1NA==} engines: {node: '>=6'} @@ -1895,6 +1891,9 @@ packages: '@types/markdown-it': '*' markdown-it: '*' + markdown-it-async@2.0.0: + resolution: {integrity: sha512-jBthmQR5MwXR9Y8Y0teRoZAenaKQMdjuTfpbNARqMBSRPvyzyXCVduHZHakyyhL3ugIacCobXJrO07t277sIjw==} + markdown-it-attrs@4.3.1: resolution: {integrity: sha512-/ko6cba+H6gdZ0DOw7BbNMZtfuJTRp9g/IrGIuz8lYc/EfnmWRpaR3CFPnNbVz0LDvF8Gf1hFGPqrQqq7De0rg==} engines: {node: '>=6'} @@ -2482,10 +2481,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - synckit@0.9.2: - resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} - engines: {node: ^14.18.0 || >=16.0.0} - tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} @@ -3162,8 +3157,6 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.18.0 - '@pkgr/core@0.1.1': {} - '@polka/compression@1.0.0-next.28': {} '@polka/url@1.0.0-next.28': {} @@ -4377,6 +4370,11 @@ snapshots: '@types/markdown-it': 14.1.2 markdown-it: 14.1.0 + markdown-it-async@2.0.0: + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + markdown-it-attrs@4.3.1(markdown-it@14.1.0): dependencies: markdown-it: 14.1.0 @@ -4962,11 +4960,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - synckit@0.9.2: - dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.8.1 - tabbable@6.2.0: {} temp-dir@3.0.0: {} diff --git a/rollup.config.ts b/rollup.config.ts index 8a996b01..29516baf 100644 --- a/rollup.config.ts +++ b/rollup.config.ts @@ -8,7 +8,6 @@ import { builtinModules, createRequire } from 'node:module' import { type RollupOptions, defineConfig } from 'rollup' import dts from 'rollup-plugin-dts' import esbuild from 'rollup-plugin-esbuild' -import { globSync } from 'tinyglobby' const require = createRequire(import.meta.url) const pkg = require('./package.json') @@ -39,11 +38,7 @@ const plugins = [ ] const esmBuild: RollupOptions = { - input: [ - 'src/node/index.ts', - 'src/node/cli.ts', - ...globSync('src/node/worker_*.ts') - ], + input: ['src/node/index.ts', 'src/node/cli.ts'], output: { format: 'esm', entryFileNames: `[name].js`, @@ -96,7 +91,10 @@ const clientTypes: RollupOptions = { }, external: typesExternal, plugins: [ - dts({ respectExternal: true }), + dts({ + respectExternal: true, + tsconfig: 'tsconfig.json' + }), { name: 'cleanup', async closeBundle() { diff --git a/src/client/theme-default/components/VPAlgoliaSearchBox.vue b/src/client/theme-default/components/VPAlgoliaSearchBox.vue index 003f5746..54901a97 100644 --- a/src/client/theme-default/components/VPAlgoliaSearchBox.vue +++ b/src/client/theme-default/components/VPAlgoliaSearchBox.vue @@ -1,6 +1,6 @@