From 1969cf4f3b93ad105595e4e2f8b030b04eb1c975 Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Sun, 16 Feb 2025 02:27:42 +0800 Subject: [PATCH] fix: upgrade shiki, remove embedded languages workaround (#4566) --- docs/.vitepress/config/shared.ts | 3 - package.json | 8 +- pnpm-lock.yaml | 102 ++++++++++++------------- src/node/markdown/plugins/highlight.ts | 19 ++--- 4 files changed, 61 insertions(+), 71 deletions(-) diff --git a/docs/.vitepress/config/shared.ts b/docs/.vitepress/config/shared.ts index 0763ce69..1f4961d2 100644 --- a/docs/.vitepress/config/shared.ts +++ b/docs/.vitepress/config/shared.ts @@ -24,9 +24,6 @@ export const shared = defineConfig({ markdown: { math: true, - // Load these languages ahead of time for embedded code highlighting - // TODO: remove this when Shiki fixes markdown embedded language loading - languages: ['js', 'ts', 'html', 'vue-html', 'css', 'yaml', 'sh'], codeTransformers: [ // We use `[!!code` in demo to prevent transformation, here we revert it back. { diff --git a/package.json b/package.json index 49cbc7f1..b7f644c7 100644 --- a/package.json +++ b/package.json @@ -98,9 +98,9 @@ "@docsearch/css": "^3.8.3", "@docsearch/js": "^3.8.3", "@iconify-json/simple-icons": "^1.2.24", - "@shikijs/core": "^2.3.2", - "@shikijs/transformers": "^2.3.2", - "@shikijs/types": "^2.3.2", + "@shikijs/core": "^2.4.1", + "@shikijs/transformers": "^2.4.1", + "@shikijs/types": "^2.4.1", "@vitejs/plugin-vue": "^5.2.1", "@vue/devtools-api": "^7.7.2", "@vue/shared": "^3.5.13", @@ -109,7 +109,7 @@ "focus-trap": "^7.6.4", "mark.js": "8.11.1", "minisearch": "^7.1.1", - "shiki": "^2.3.2", + "shiki": "^2.4.1", "vite": "^6.1.0", "vue": "^3.5.13" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2a7e98c3..99f5817b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,14 +29,14 @@ importers: specifier: ^1.2.24 version: 1.2.24 '@shikijs/core': - specifier: ^2.3.2 - version: 2.3.2 + specifier: ^2.4.1 + version: 2.4.1 '@shikijs/transformers': - specifier: ^2.3.2 - version: 2.3.2 + specifier: ^2.4.1 + version: 2.4.1 '@shikijs/types': - specifier: ^2.3.2 - version: 2.3.2 + specifier: ^2.4.1 + version: 2.4.1 '@vitejs/plugin-vue': specifier: ^5.2.1 version: 5.2.1(vite@6.1.0(@types/node@22.13.4)(jiti@1.21.7)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) @@ -62,8 +62,8 @@ importers: specifier: ^7.1.1 version: 7.1.1 shiki: - specifier: ^2.3.2 - version: 2.3.2 + specifier: ^2.4.1 + version: 2.4.1 vite: specifier: ^6.1.0 version: 6.1.0(@types/node@22.13.4)(jiti@1.21.7)(yaml@2.7.0) @@ -1013,26 +1013,26 @@ packages: '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@shikijs/core@2.3.2': - resolution: {integrity: sha512-s7vyL3LzUKm3Qwf36zRWlavX9BQMZTIq9B1almM63M5xBuSldnsTHCmsXzoF/Kyw4k7Xgas7yAyJz9VR/vcP1A==} + '@shikijs/core@2.4.1': + resolution: {integrity: sha512-c7AkRsCpSVjKHsTwuvRVMEAdADq4Z1KoodcS4LaIqMzBTM0+Q572VRk1PIxtzaMtdiHlRPO6mH5iPdJoTV59mQ==} - '@shikijs/engine-javascript@2.3.2': - resolution: {integrity: sha512-w3IEMu5HfL/OaJTsMbIfZ1HRPnWVYRANeDtmsdIIEgUOcLjzFJFQwlnkckGjKHekEzNqlMLbgB/twnfZ/EEAGg==} + '@shikijs/engine-javascript@2.4.1': + resolution: {integrity: sha512-2DnVilsUCgA81lnxt67dEZf2C6hdRzDYIs7yG33yWQIjljAxlXi3MKt7n0BXKr6uT5sZ0JdtX/+Pq2FN31YVdQ==} - '@shikijs/engine-oniguruma@2.3.2': - resolution: {integrity: sha512-vikMY1TroyZXUHIXbMnvY/mjtOxMn+tavcfAeQPgWS9FHcgFSUoEtywF5B5sOLb9NXb8P2vb7odkh3nj15/00A==} + '@shikijs/engine-oniguruma@2.4.1': + resolution: {integrity: sha512-PvN76WM2HjmSbNQmLl8Jzm3h8Hsf/g9kKs3jPWKD6uMpCfk+M3HalWONz85zQF4lqrI3lamMTV5pHcOVSswpqg==} - '@shikijs/langs@2.3.2': - resolution: {integrity: sha512-UqI6bSxFzhexIJficZLKeB1L2Sc3xoNiAV0yHpfbg5meck93du+EKQtsGbBv66Ki53XZPhnR/kYkOr85elIuFw==} + '@shikijs/langs@2.4.1': + resolution: {integrity: sha512-MLpCfw8gqWAgYvkV4Qsh/yjJirGhqwBQqtNgNrYOES7IoMTsthQ2x/8+JEO1hIDyS3qJPSooxCGQpX7EXsiFpQ==} - '@shikijs/themes@2.3.2': - resolution: {integrity: sha512-QAh7D/hhfYKHibkG2tti8vxNt3ekAH5EqkXJeJbTh7FGvTCWEI7BHqNCtMdjFvZ0vav5nvUgdvA7/HI7pfsB4w==} + '@shikijs/themes@2.4.1': + resolution: {integrity: sha512-U+Yt03Qfy9251BjQkPf9IkbiRypCqLcxfeCkk9cjqAuAhgM6G+v8GRHB+7VR1OQu92sWkhmk+zdbJAhgAnnL8g==} - '@shikijs/transformers@2.3.2': - resolution: {integrity: sha512-2HDnJumw8A/9GecRpTgvfqSbPjEbJ4DPWq5J++OVP1gNMLvbV0MqFsP4canqRNM1LqB7VmWY45Stipb0ZIJ+0A==} + '@shikijs/transformers@2.4.1': + resolution: {integrity: sha512-vTvV4+Fv9LJDWVgB/3o/q7EyYZFiJIEEOsS9KQ/8wyL6jKE+9m0fvuPmpx3SGjmj/MQcqnRBwKaXBW29M5XmLA==} - '@shikijs/types@2.3.2': - resolution: {integrity: sha512-CBaMY+a3pepyC4SETi7+bSzO0f6hxEQJUUuS4uD7zppzjmrN4ZRtBqxaT+wOan26CR9eeJ5iBhc4qvWEwn7Eeg==} + '@shikijs/types@2.4.1': + resolution: {integrity: sha512-fE73tqCjiHIDUq7SYU8i4d9TyOcJh2u2J8aQGqQs0KkFg6FbBEQoDiBASMM5Vxqag1VS58y+MHLBuSQmwtB4Og==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -1146,8 +1146,8 @@ packages: '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@ungap/structured-clone@1.2.1': + resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} '@vitejs/plugin-vue@5.2.1': resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} @@ -2565,8 +2565,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@2.3.2: - resolution: {integrity: sha512-UZhz/gsUz7DHFbQBOJP7eXqvKyYvMGramxQiSDc83M/7OkWm6OdVHAReEc3vMLh6L6TRhgL9dvhXz9XDkCDaaw==} + shiki@2.4.1: + resolution: {integrity: sha512-1MmgQgSSx04OSUPqTg7deJudOL4vXpkNEJHlzKEoVNOLFUmXPB/vRvJoLxzy/Un+UIp4zryXJcWDUAUTOSbDyw==} siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -3572,40 +3572,40 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} - '@shikijs/core@2.3.2': + '@shikijs/core@2.4.1': dependencies: - '@shikijs/engine-javascript': 2.3.2 - '@shikijs/engine-oniguruma': 2.3.2 - '@shikijs/types': 2.3.2 + '@shikijs/engine-javascript': 2.4.1 + '@shikijs/engine-oniguruma': 2.4.1 + '@shikijs/types': 2.4.1 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.4 - '@shikijs/engine-javascript@2.3.2': + '@shikijs/engine-javascript@2.4.1': dependencies: - '@shikijs/types': 2.3.2 + '@shikijs/types': 2.4.1 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 3.1.0 - '@shikijs/engine-oniguruma@2.3.2': + '@shikijs/engine-oniguruma@2.4.1': dependencies: - '@shikijs/types': 2.3.2 + '@shikijs/types': 2.4.1 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@2.3.2': + '@shikijs/langs@2.4.1': dependencies: - '@shikijs/types': 2.3.2 + '@shikijs/types': 2.4.1 - '@shikijs/themes@2.3.2': + '@shikijs/themes@2.4.1': dependencies: - '@shikijs/types': 2.3.2 + '@shikijs/types': 2.4.1 - '@shikijs/transformers@2.3.2': + '@shikijs/transformers@2.4.1': dependencies: - '@shikijs/core': 2.3.2 - '@shikijs/types': 2.3.2 + '@shikijs/core': 2.4.1 + '@shikijs/types': 2.4.1 - '@shikijs/types@2.3.2': + '@shikijs/types@2.4.1': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -3723,7 +3723,7 @@ snapshots: '@types/web-bluetooth@0.0.20': {} - '@ungap/structured-clone@1.3.0': {} + '@ungap/structured-clone@1.2.1': {} '@vitejs/plugin-vue@5.2.1(vite@6.1.0(@types/node@22.13.4)(jiti@1.21.7)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))': dependencies: @@ -4811,7 +4811,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.0 + '@ungap/structured-clone': 1.2.1 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -5220,14 +5220,14 @@ snapshots: shebang-regex@3.0.0: {} - shiki@2.3.2: + shiki@2.4.1: dependencies: - '@shikijs/core': 2.3.2 - '@shikijs/engine-javascript': 2.3.2 - '@shikijs/engine-oniguruma': 2.3.2 - '@shikijs/langs': 2.3.2 - '@shikijs/themes': 2.3.2 - '@shikijs/types': 2.3.2 + '@shikijs/core': 2.4.1 + '@shikijs/engine-javascript': 2.4.1 + '@shikijs/engine-oniguruma': 2.4.1 + '@shikijs/langs': 2.4.1 + '@shikijs/themes': 2.4.1 + '@shikijs/types': 2.4.1 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 diff --git a/src/node/markdown/plugins/highlight.ts b/src/node/markdown/plugins/highlight.ts index f0a0170e..3746fb45 100644 --- a/src/node/markdown/plugins/highlight.ts +++ b/src/node/markdown/plugins/highlight.ts @@ -7,8 +7,8 @@ import { type TransformerCompactLineOption } from '@shikijs/transformers' import { customAlphabet } from 'nanoid' -import type { LanguageRegistration, ShikiTransformer } from 'shiki' -import { createHighlighter, isSpecialLang } from 'shiki' +import type { ShikiTransformer, BundledLanguage } from 'shiki' +import { createHighlighter, guessEmbeddedLanguages } from 'shiki' import type { Logger } from 'vite' import type { MarkdownOptions, ThemeOptions } from '../markdown' import c from 'picocolors' @@ -71,16 +71,6 @@ export async function highlight( langAlias: options.languageAlias }) - async function loadLanguage(name: string | LanguageRegistration) { - const lang = typeof name === 'string' ? name : name.name - if ( - !isSpecialLang(lang) && - !highlighter.getLoadedLanguages().includes(lang) - ) { - await highlighter.loadLanguage(lang as any) - } - } - await options?.shikiSetup?.(highlighter) // TODO: remove explicit matchAlgorithm in shiki v3 @@ -129,7 +119,7 @@ export async function highlight( .toLowerCase() || defaultLang try { - await loadLanguage(lang) + await highlighter.loadLanguage(lang as any) } catch { logger.warn( c.yellow( @@ -163,6 +153,9 @@ export async function highlight( str = removeMustache(str).trimEnd() + const embeddedLang = guessEmbeddedLanguages(str, lang, highlighter) + await highlighter.loadLanguage(...(embeddedLang as BundledLanguage[])) + const highlighted = highlighter.codeToHtml(str, { lang, transformers: [