Repository: shikijs/shiki
Pull request #959 (2025-03-04 09:02:49)

fix: failed to run shiki docs server locally
<!-- DO NOT IGNORE THE TEMPLATE!

Thank you for contributing!

Before submitting the PR, please make sure you do the following:

- Read the [Contributing Guide](https://github.com/shikijs/shiki/blob/main/CONTRIBUTING.md).
- Check that there isn't already a PR that solves the problem the same way to avoid creating a duplicate.
- Provide a description in this PR that addresses **what** the PR is solving, or reference the issue that it solves (e.g. `fixes #123`).
- Ideally, include relevant tests that fail without this PR but pass with it.

-->

### Description

Improve docs local development setup experience. Make it literally work. ⚡
<img width="609" alt="image" src="https://github.com/user-attachments/assets/f3b9eebd-afd5-4fe1-9d5f-1035a3690201" />

### Linked Issues

### Additional context

Hi maintainers! Today I tried to set up a local development environment for self-testing and ready for contributions. Gladly, I found the `CONTRIBUTING.md` and followed the steps. 

However, it doesn't work out well... 😢 The issue arises from some essential configurations being missed, leading to problems for users.

<img width="1296" alt="image" src="https://github.com/user-attachments/assets/bc8763de-1089-4e05-bbd4-c775d6dfd93c" />

 


netlify[bot]: ### <span aria-hidden="true">👷</span> Deploy Preview for *shiki-matsu* processing.


|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | afb2494ec653ce2fda5f26fbbde3cfb92e4fcaa1 |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/shiki-matsu/deploys/67c6c1bc58799b0008210a7b |
netlify[bot]: ### <span aria-hidden="true">👷</span> Deploy Preview for *shiki-next* processing.


|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | afb2494ec653ce2fda5f26fbbde3cfb92e4fcaa1 |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/shiki-next/deploys/67c6c1bc08798f0008b642b3 |

Patch:
diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts
index f5a13bce..91cec02c 100644
--- a/docs/.vitepress/config.ts
+++ b/docs/.vitepress/config.ts
@@ -144,7 +144,7 @@ export default withMermaid(defineConfig({
       transformerRemoveNotationEscape(),
       transformerColorizedBrackets({ explicitTrigger: true }),
     ],
-    languages: ['js', 'jsx', 'ts', 'tsx'],
+    languages: ['js', 'jsx', 'ts', 'tsx', 'html'],
     config: (md) => {
       md.use(groupIconMdPlugin)
     },
diff --git a/package.json b/package.json
index 26cfde6b..e73c2a4b 100644
--- a/package.json
+++ b/package.json
@@ -38,6 +38,7 @@
     "@shikijs/vitepress-twoslash": "workspace:*",
     "@types/fs-extra": "catalog:",
     "@types/hast": "catalog:",
+    "@types/js-yaml": "catalog:",
     "@types/node": "catalog:",
     "@vitest/coverage-v8": "catalog:",
     "ansi-sequence-parser": "catalog:",
@@ -48,9 +49,11 @@
     "eslint-plugin-format": "catalog:",
     "esno": "catalog:",
     "fast-glob": "catalog:",
+    "find-up-simple": "catalog:",
     "fs-extra": "catalog:",
     "hast-util-to-html": "catalog:",
     "jiti": "catalog:",
+    "js-yaml": "catalog:",
     "jsonc-parser": "catalog:",
     "lint-staged": "catalog:",
     "markdown-it": "catalog:",
@@ -75,6 +78,7 @@
     "vite-tsconfig-paths": "catalog:",
     "vitepress-plugin-mermaid": "catalog:",
     "vitest": "catalog:",
+    "vitest-package-exports": "catalog:",
     "vue-tsc": "catalog:",
     "wrangler": "catalog:"
   },
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 3277ca62..549b609e 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -51,6 +51,9 @@ catalogs:
     '@types/fs-extra':
       specifier: ^11.0.4
       version: 11.0.4
+    '@types/js-yaml':
+      specifier: ^4.0.9
+      version: 4.0.9
     '@types/markdown-it':
       specifier: ^14.1.2
       version: 14.1.2
@@ -96,6 +99,9 @@ catalogs:
     fast-glob:
       specifier: ^3.3.3
       version: 3.3.3
+    find-up-simple:
+      specifier: ^1.0.0
+      version: 1.0.0
     floating-vue:
       specifier: ^5.2.2
       version: 5.2.2
@@ -117,6 +123,9 @@ catalogs:
     jiti:
       specifier: ^2.4.2
       version: 2.4.2
+    js-yaml:
+      specifier: ^4.1.0
+      version: 4.1.0
     jsonc-parser:
       specifier: ^3.3.1
       version: 3.3.1
@@ -231,6 +240,9 @@ catalogs:
     vitest:
       specifier: ^3.0.7
       version: 3.0.7
+    vitest-package-exports:
+      specifier: ^0.1.0
+      version: 0.1.0
     vue:
       specifier: ^3.5.13
       version: 3.5.13
@@ -330,6 +342,9 @@ importers:
       '@types/hast':
         specifier: ^3.0.4
         version: 3.0.4
+      '@types/js-yaml':
+        specifier: 'catalog:'
+        version: 4.0.9
       '@types/node':
         specifier: 'catalog:'
         version: 22.13.5
@@ -360,6 +375,9 @@ importers:
       fast-glob:
         specifier: 'catalog:'
         version: 3.3.3
+      find-up-simple:
+        specifier: 'catalog:'
+        version: 1.0.0
       fs-extra:
         specifier: 'catalog:'
         version: 11.3.0
@@ -369,6 +387,9 @@ importers:
       jiti:
         specifier: 'catalog:'
         version: 2.4.2
+      js-yaml:
+        specifier: 'catalog:'
+        version: 4.1.0
       jsonc-parser:
         specifier: 'catalog:'
         version: 3.3.1
@@ -441,6 +462,9 @@ importers:
       vitest:
         specifier: 'catalog:'
         version: 3.0.7(@types/debug@4.1.12)(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0)
+      vitest-package-exports:
+        specifier: 'catalog:'
+        version: 0.1.0
       vue-tsc:
         specifier: 'catalog:'
         version: 2.2.4(typescript@5.7.3)
@@ -2245,6 +2269,9 @@ packages:
   '@types/hast@3.0.4':
     resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
 
+  '@types/js-yaml@4.0.9':
+    resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==}
+
   '@types/json-schema@7.0.15':
     resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
 
@@ -5364,6 +5391,9 @@ packages:
       postcss:
         optional: true
 
+  vitest-package-exports@0.1.0:
+    resolution: {integrity: sha512-h83R5dqOstC0xNPLJUqvtu4yx83l7Eu4gMQJZfTYjP7eqvOoVUPK3hMBEQMzndleUygRatr7/kBHOeINEvz1OQ==}
+
   vitest@3.0.7:
     resolution: {integrity: sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
@@ -6727,6 +6757,8 @@ snapshots:
     dependencies:
       '@types/unist': 3.0.3
 
+  '@types/js-yaml@4.0.9': {}
+
   '@types/json-schema@7.0.15': {}
 
   '@types/jsonfile@6.1.4':
@@ -10543,6 +10575,11 @@ snapshots:
       - universal-cookie
       - yaml
 
+  vitest-package-exports@0.1.0:
+    dependencies:
+      find-up-simple: 1.0.0
+      pathe: 2.0.3
+
   vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.5)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0):
     dependencies:
       '@vitest/expect': 3.0.7
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 5ce6e814..495f16b3 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -22,6 +22,7 @@ catalog:
   '@shikijs/vscode-textmate': ^10.0.2
   '@types/fs-extra': ^11.0.4
   '@types/hast': ^3.0.4
+  '@types/js-yaml': ^4.0.9
   '@types/markdown-it': ^14.1.2
   '@types/mdast': ^4.0.4
   '@types/minimist': ^1.2.5
@@ -39,6 +40,7 @@ catalog:
   eslint-plugin-format: ^1.0.1
   esno: ^4.8.0
   fast-glob: ^3.3.3
+  find-up-simple: ^1.0.0
   floating-vue: ^5.2.2
   fs-extra: ^11.3.0
   fuse.js: ^7.1.0
@@ -46,6 +48,7 @@ catalog:
   hast-util-to-html: ^9.0.5
   hast-util-to-string: ^3.0.1
   jiti: ^2.4.2
+  js-yaml: ^4.1.0
   jsonc-parser: ^3.3.1
   lint-staged: ^15.4.3
   markdown-it: ^14.1.0
@@ -88,6 +91,7 @@ catalog:
   vitepress-plugin-group-icons: ^1.3.6
   vitepress-plugin-mermaid: ^2.0.17
   vitest: ^3.0.7
+  vitest-package-exports: ^0.1.0
   vscode-oniguruma: 1.7.0
   vue: ^3.5.13
   vue-tsc: ^2.2.4


Test patch:
diff --git a/test/exports.test.ts b/test/exports.test.ts
new file mode 100644
index 00000000..10e81c56
--- /dev/null
+++ b/test/exports.test.ts
@@ -0,0 +1,28 @@
+import yaml from 'js-yaml'
+import { x } from 'tinyexec'
+import { describe, expect, it } from 'vitest'
+import { getPackageExportsManifest } from 'vitest-package-exports'
+
+describe('exports-snapshot', async () => {
+  const packages: { name: string, path: string, private?: boolean }[] = JSON.parse(
+    await x('pnpm', ['ls', '--only-projects', '-r', '--json']).then(r => r.stdout),
+  )
+
+  for (const pkg of packages) {
+    if (pkg.private)
+      continue
+    if (pkg.name === '@shikijs/themes' || pkg.name === '@shikijs/langs' || pkg.name === '@shikijs/langs-precompiled')
+      continue
+    it(`${pkg.name}`, async () => {
+      const manifest = await getPackageExportsManifest({
+        importMode: 'src',
+        cwd: pkg.path,
+        resolveExportEntries(entries) {
+          return entries.filter(([path]) => path !== './cli' && !path.endsWith('.css') && !path.endsWith('.wasm'))
+        },
+      })
+      await expect(yaml.dump(manifest.exports, { sortKeys: (a, b) => a.localeCompare(b) }))
+        .toMatchFileSnapshot(`./exports/${pkg.name}.yaml`)
+    })
+  }
+})
diff --git a/test/exports/@shikijs/cli.yaml b/test/exports/@shikijs/cli.yaml
new file mode 100644
index 00000000..885a6f5b
--- /dev/null
+++ b/test/exports/@shikijs/cli.yaml
@@ -0,0 +1,2 @@
+.:
+  codeToANSI: function
diff --git a/test/exports/@shikijs/colorized-brackets.yaml b/test/exports/@shikijs/colorized-brackets.yaml
new file mode 100644
index 00000000..892316cf
--- /dev/null
+++ b/test/exports/@shikijs/colorized-brackets.yaml
@@ -0,0 +1,2 @@
+.:
+  transformerColorizedBrackets: function
diff --git a/test/exports/@shikijs/core.yaml b/test/exports/@shikijs/core.yaml
new file mode 100644
index 00000000..c2971f9c
--- /dev/null
+++ b/test/exports/@shikijs/core.yaml
@@ -0,0 +1,50 @@
+.:
+  addClassToHast: function
+  applyColorReplacements: function
+  codeToHast: function
+  codeToHtml: function
+  codeToTokens: function
+  codeToTokensBase: function
+  codeToTokensWithThemes: function
+  createCssVariablesTheme: function
+  createdBundledHighlighter: function
+  createHighlighterCore: function
+  createHighlighterCoreSync: function
+  createPositionConverter: function
+  createShikiInternal: function
+  createShikiInternalSync: function
+  createSingletonShorthands: function
+  enableDeprecationWarnings: function
+  flatTokenVariants: function
+  getSingletonHighlighterCore: function
+  getTokenStyleObject: function
+  guessEmbeddedLanguages: function
+  hastToHtml: function
+  isNoneTheme: function
+  isPlainLang: function
+  isSpecialLang: function
+  isSpecialTheme: function
+  makeSingletonHighlighter: function
+  makeSingletonHighlighterCore: function
+  normalizeGetter: function
+  normalizeTheme: function
+  resolveColorReplacements: function
+  ShikiError: function
+  splitLines: function
+  splitToken: function
+  splitTokens: function
+  stringifyTokenStyle: function
+  toArray: function
+  tokenizeAnsiWithTheme: function
+  tokenizeWithTheme: function
+  tokensToHast: function
+  transformerDecorations: function
+  warnDeprecated: function
+./textmate:
+  disposeOnigString: function
+  EncodedTokenMetadata: function
+  FindOption: object
+  FontStyle: object
+  INITIAL: object
+  Registry: function
+  Theme: function
diff --git a/test/exports/@shikijs/engine-javascript.yaml b/test/exports/@shikijs/engine-javascript.yaml
new file mode 100644
index 00000000..c499f8bb
--- /dev/null
+++ b/test/exports/@shikijs/engine-javascript.yaml
@@ -0,0 +1,7 @@
+.:
+  createJavaScriptRawEngine: function
+  createJavaScriptRegexEngine: function
+  defaultJavaScriptRegexConstructor: function
+  JavaScriptScanner: function
+./raw:
+  createJavaScriptRawEngine: function
diff --git a/test/exports/@shikijs/engine-oniguruma.yaml b/test/exports/@shikijs/engine-oniguruma.yaml
new file mode 100644
index 00000000..4b2e4a9c
--- /dev/null
+++ b/test/exports/@shikijs/engine-oniguruma.yaml
@@ -0,0 +1,9 @@
+.:
+  createOnigurumaEngine: function
+  getDefaultWasmLoader: function
+  loadWasm: function
+  setDefaultWasmLoader: function
+./wasm-inlined:
+  default: function
+  getWasmInstance: function
+  wasmBinary: object
diff --git a/test/exports/@shikijs/markdown-it.yaml b/test/exports/@shikijs/markdown-it.yaml
new file mode 100644
index 00000000..48347e59
--- /dev/null
+++ b/test/exports/@shikijs/markdown-it.yaml
@@ -0,0 +1,10 @@
+.:
+  default: function
+  fromHighlighter: function
+  setupMarkdownIt: function
+./async:
+  fromAsyncCodeToHtml: function
+  setupMarkdownWithCodeToHtml: function
+./core:
+  fromHighlighter: function
+  setupMarkdownIt: function
diff --git a/test/exports/@shikijs/monaco.yaml b/test/exports/@shikijs/monaco.yaml
new file mode 100644
index 00000000..ddfd49df
--- /dev/null
+++ b/test/exports/@shikijs/monaco.yaml
@@ -0,0 +1,3 @@
+.:
+  shikiToMonaco: function
+  textmateThemeToMonacoTheme: function
diff --git a/test/exports/@shikijs/rehype.yaml b/test/exports/@shikijs/rehype.yaml
new file mode 100644
index 00000000..624d94af
--- /dev/null
+++ b/test/exports/@shikijs/rehype.yaml
@@ -0,0 +1,4 @@
+.:
+  default: function
+./core:
+  default: function
diff --git a/test/exports/@shikijs/transformers.yaml b/test/exports/@shikijs/transformers.yaml
new file mode 100644
index 00000000..7094e4f5
--- /dev/null
+++ b/test/exports/@shikijs/transformers.yaml
@@ -0,0 +1,18 @@
+.:
+  createCommentNotationTransformer: function
+  findAllSubstringIndexes: function
+  parseMetaHighlightString: function
+  parseMetaHighlightWords: function
+  transformerCompactLineOptions: function
+  transformerMetaHighlight: function
+  transformerMetaWordHighlight: function
+  transformerNotationDiff: function
+  transformerNotationErrorLevel: function
+  transformerNotationFocus: function
+  transformerNotationHighlight: function
+  transformerNotationMap: function
+  transformerNotationWordHighlight: function
+  transformerRemoveLineBreak: function
+  transformerRemoveNotationEscape: function
+  transformerRenderWhitespace: function
+  transformerStyleToClass: function
diff --git a/test/exports/@shikijs/twoslash.yaml b/test/exports/@shikijs/twoslash.yaml
new file mode 100644
index 00000000..e48b8854
--- /dev/null
+++ b/test/exports/@shikijs/twoslash.yaml
@@ -0,0 +1,19 @@
+.:
+  createTransformerFactory: function
+  defaultCompletionIcons: object
+  defaultCustomTagIcons: object
+  defaultHoverInfoProcessor: function
+  defaultTwoslashOptions: function
+  rendererClassic: function
+  rendererRich: function
+  ShikiTwoslashError: function
+  transformerTwoslash: function
+./core:
+  createTransformerFactory: function
+  defaultCompletionIcons: object
+  defaultCustomTagIcons: object
+  defaultHoverInfoProcessor: function
+  defaultTwoslashOptions: function
+  rendererClassic: function
+  rendererRich: function
+  ShikiTwoslashError: function
diff --git a/test/exports/@shikijs/types.yaml b/test/exports/@shikijs/types.yaml
new file mode 100644
index 00000000..d85639fb
--- /dev/null
+++ b/test/exports/@shikijs/types.yaml
@@ -0,0 +1,2 @@
+.:
+  ShikiError: function
diff --git a/test/exports/@shikijs/vitepress-twoslash.yaml b/test/exports/@shikijs/vitepress-twoslash.yaml
new file mode 100644
index 00000000..85269177
--- /dev/null
+++ b/test/exports/@shikijs/vitepress-twoslash.yaml
@@ -0,0 +1,8 @@
+.:
+  defaultHoverInfoProcessor: function
+  rendererFloatingVue: function
+  transformerTwoslash: function
+./cache-fs:
+  createFileSystemTypesCache: function
+./client:
+  default: object
diff --git a/test/exports/shiki-codegen.yaml b/test/exports/shiki-codegen.yaml
new file mode 100644
index 00000000..d8bfb22e
--- /dev/null
+++ b/test/exports/shiki-codegen.yaml
@@ -0,0 +1,2 @@
+.:
+  codegen: function
diff --git a/test/exports/shiki.yaml b/test/exports/shiki.yaml
new file mode 100644
index 00000000..7997d562
--- /dev/null
+++ b/test/exports/shiki.yaml
@@ -0,0 +1,230 @@
+.:
+  addClassToHast: function
+  applyColorReplacements: function
+  bundledLanguages: object
+  bundledLanguagesAlias: object
+  bundledLanguagesBase: object
+  bundledLanguagesInfo: object
+  bundledThemes: object
+  bundledThemesInfo: object
+  codeToHast: function
+  codeToHtml: function
+  codeToTokens: function
+  codeToTokensBase: function
+  codeToTokensWithThemes: function
+  createCssVariablesTheme: function
+  createdBundledHighlighter: function
+  createHighlighter: function
+  createHighlighterCore: function
+  createHighlighterCoreSync: function
+  createJavaScriptRegexEngine: function
+  createOnigurumaEngine: function
+  createPositionConverter: function
+  createShikiInternal: function
+  createShikiInternalSync: function
+  createSingletonShorthands: function
+  defaultJavaScriptRegexConstructor: function
+  enableDeprecationWarnings: function
+  flatTokenVariants: function
+  getLastGrammarState: function
+  getSingletonHighlighter: function
+  getSingletonHighlighterCore: function
+  getTokenStyleObject: function
+  guessEmbeddedLanguages: function
+  hastToHtml: function
+  isNoneTheme: function
+  isPlainLang: function
+  isSpecialLang: function
+  isSpecialTheme: function
+  loadWasm: function
+  makeSingletonHighlighter: function
+  makeSingletonHighlighterCore: function
+  normalizeGetter: function
+  normalizeTheme: function
+  resolveColorReplacements: function
+  ShikiError: function
+  splitLines: function
+  splitToken: function
+  splitTokens: function
+  stringifyTokenStyle: function
+  toArray: function
+  tokenizeAnsiWithTheme: function
+  tokenizeWithTheme: function
+  tokensToHast: function
+  transformerDecorations: function
+  warnDeprecated: function
+./bundle/full:
+  addClassToHast: function
+  applyColorReplacements: function
+  bundledLanguages: object
+  bundledLanguagesAlias: object
+  bundledLanguagesBase: object
+  bundledLanguagesInfo: object
+  bundledThemes: object
+  bundledThemesInfo: object
+  codeToHast: function
+  codeToHtml: function
+  codeToTokens: function
+  codeToTokensBase: function
+  codeToTokensWithThemes: function
+  createCssVariablesTheme: function
+  createdBundledHighlighter: function
+  createHighlighter: function
+  createHighlighterCore: function
+  createHighlighterCoreSync: function
+  createPositionConverter: function
+  createShikiInternal: function
+  createShikiInternalSync: function
+  createSingletonShorthands: function
+  enableDeprecationWarnings: function
+  flatTokenVariants: function
+  getLastGrammarState: function
+  getSingletonHighlighter: function
+  getSingletonHighlighterCore: function
+  getTokenStyleObject: function
+  guessEmbeddedLanguages: function
+  hastToHtml: function
+  isNoneTheme: function
+  isPlainLang: function
+  isSpecialLang: function
+  isSpecialTheme: function
+  makeSingletonHighlighter: function
+  makeSingletonHighlighterCore: function
+  normalizeGetter: function
+  normalizeTheme: function
+  resolveColorReplacements: function
+  ShikiError: function
+  splitLines: function
+  splitToken: function
+  splitTokens: function
+  stringifyTokenStyle: function
+  toArray: function
+  tokenizeAnsiWithTheme: function
+  tokenizeWithTheme: function
+  tokensToHast: function
+  transformerDecorations: function
+  warnDeprecated: function
+./bundle/web:
+  addClassToHast: function
+  applyColorReplacements: function
+  bundledLanguages: object
+  bundledLanguagesAlias: object
+  bundledLanguagesBase: object
+  bundledLanguagesInfo: object
+  bundledThemes: object
+  bundledThemesInfo: object
+  codeToHast: function
+  codeToHtml: function
+  codeToTokens: function
+  codeToTokensBase: function
+  codeToTokensWithThemes: function
+  createCssVariablesTheme: function
+  createdBundledHighlighter: function
+  createHighlighter: function
+  createHighlighterCore: function
+  createHighlighterCoreSync: function
+  createPositionConverter: function
+  createShikiInternal: function
+  createShikiInternalSync: function
+  createSingletonShorthands: function
+  enableDeprecationWarnings: function
+  flatTokenVariants: function
+  getLastGrammarState: function
+  getSingletonHighlighter: function
+  getSingletonHighlighterCore: function
+  getTokenStyleObject: function
+  guessEmbeddedLanguages: function
+  hastToHtml: function
+  isNoneTheme: function
+  isPlainLang: function
+  isSpecialLang: function
+  isSpecialTheme: function
+  makeSingletonHighlighter: function
+  makeSingletonHighlighterCore: function
+  normalizeGetter: function
+  normalizeTheme: function
+  resolveColorReplacements: function
+  ShikiError: function
+  splitLines: function
+  splitToken: function
+  splitTokens: function
+  stringifyTokenStyle: function
+  toArray: function
+  tokenizeAnsiWithTheme: function
+  tokenizeWithTheme: function
+  tokensToHast: function
+  transformerDecorations: function
+  warnDeprecated: function
+./core:
+  addClassToHast: function
+  applyColorReplacements: function
+  codeToHast: function
+  codeToHtml: function
+  codeToTokens: function
+  codeToTokensBase: function
+  codeToTokensWithThemes: function
+  createCssVariablesTheme: function
+  createdBundledHighlighter: function
+  createHighlighterCore: function
+  createHighlighterCoreSync: function
+  createPositionConverter: function
+  createShikiInternal: function
+  createShikiInternalSync: function
+  createSingletonShorthands: function
+  enableDeprecationWarnings: function
+  flatTokenVariants: function
+  getSingletonHighlighterCore: function
+  getTokenStyleObject: function
+  guessEmbeddedLanguages: function
+  hastToHtml: function
+  isNoneTheme: function
+  isPlainLang: function
+  isSpecialLang: function
+  isSpecialTheme: function
+  makeSingletonHighlighter: function
+  makeSingletonHighlighterCore: function
+  normalizeGetter: function
+  normalizeTheme: function
+  resolveColorReplacements: function
+  ShikiError: function
+  splitLines: function
+  splitToken: function
+  splitTokens: function
+  stringifyTokenStyle: function
+  toArray: function
+  tokenizeAnsiWithTheme: function
+  tokenizeWithTheme: function
+  tokensToHast: function
+  transformerDecorations: function
+  warnDeprecated: function
+./engine/javascript:
+  createJavaScriptRawEngine: function
+  createJavaScriptRegexEngine: function
+  defaultJavaScriptRegexConstructor: function
+  JavaScriptScanner: function
+./engine/oniguruma:
+  createOnigurumaEngine: function
+  getDefaultWasmLoader: function
+  loadWasm: function
+  setDefaultWasmLoader: function
+./langs:
+  bundledLanguages: object
+  bundledLanguagesAlias: object
+  bundledLanguagesBase: object
+  bundledLanguagesInfo: object
+./textmate:
+  disposeOnigString: function
+  EncodedTokenMetadata: function
+  FindOption: object
+  FontStyle: object
+  INITIAL: object
+  Registry: function
+  Theme: function
+./themes:
+  bundledThemes: object
+  bundledThemesInfo: object
+./types: {}
+./wasm:
+  default: function
+  getWasmInstance: function
+  wasmBinary: object
diff --git a/vitest.config.ts b/vitest.config.ts
index a6f41dd9..fa9f6dd3 100644
--- a/vitest.config.ts
+++ b/vitest.config.ts
@@ -18,6 +18,7 @@ export default defineConfig({
     server: {
       deps: {
         inline: [
+          'vitest-package-exports',
           /\.wasm/,
         ],
       },