Skip to content

Commit 513224f

Browse files
committedSep 1, 2024··
feat(core): new options object signature for createdBundledHighlighter for custom engine bundle, deprecate old signature
1 parent 6983ac4 commit 513224f

16 files changed

+11814
-63
lines changed
 

‎packages/core/src/constructors/bundle-factory.ts

+52-5
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,72 @@
11
import type { Root } from 'hast'
2-
import type { BundledHighlighterOptions, CodeToHastOptions, CodeToTokensBaseOptions, CodeToTokensOptions, CodeToTokensWithThemesOptions, GrammarState, HighlighterCoreOptions, HighlighterGeneric, LanguageInput, RequireKeys, SpecialLanguage, SpecialTheme, ThemeInput, ThemedToken, ThemedTokenWithVariants, TokensResult } from '../types'
2+
import type { Awaitable, BundledHighlighterOptions, CodeToHastOptions, CodeToTokensBaseOptions, CodeToTokensOptions, CodeToTokensWithThemesOptions, CreatedBundledHighlighterOptions, GrammarState, HighlighterCoreOptions, HighlighterGeneric, LanguageInput, RegexEngine, RequireKeys, SpecialLanguage, SpecialTheme, ThemeInput, ThemedToken, ThemedTokenWithVariants, TokensResult } from '../types'
33
import { isSpecialLang, isSpecialTheme } from '../utils'
44
import { ShikiError } from '../error'
5+
import { createWasmOnigEngine } from '../engines/wasm'
56
import { createHighlighterCore } from './highlighter'
67

78
export type CreateHighlighterFactory<L extends string, T extends string> = (
89
options: BundledHighlighterOptions<L, T>
910
) => Promise<HighlighterGeneric<L, T>>
1011

12+
/**
13+
* Create a `createHighlighter` function with bundled themes, languages, and engine.
14+
*
15+
* @example
16+
* ```ts
17+
* const createHighlighter = createdBundledHighlighter({
18+
* langs: {
19+
* typescript: () => import('shiki/langs/typescript.mjs'),
20+
* // ...
21+
* },
22+
* themes: {
23+
* nord: () => import('shiki/themes/nord.mjs'),
24+
* // ...
25+
* },
26+
* engine: () => createWasmOnigEngine(), // or createJavaScriptRegexEngine()
27+
* })
28+
* ```
29+
*
30+
* @param options
31+
*/
32+
export function createdBundledHighlighter<BundledLangs extends string, BundledThemes extends string>(
33+
options: CreatedBundledHighlighterOptions<BundledLangs, BundledThemes>
34+
): CreateHighlighterFactory<BundledLangs, BundledThemes>
35+
1136
/**
1237
* Create a `createHighlighter` function with bundled themes and languages.
1338
*
14-
* @param bundledLanguages
15-
* @param bundledThemes
16-
* @param loadWasm
39+
* @deprecated Use `createdBundledHighlighter({ langs, themes, engine })` signature instead.
1740
*/
1841
export function createdBundledHighlighter<BundledLangs extends string, BundledThemes extends string>(
1942
bundledLanguages: Record<BundledLangs, LanguageInput>,
2043
bundledThemes: Record<BundledThemes, ThemeInput>,
2144
loadWasm: HighlighterCoreOptions['loadWasm'],
45+
): CreateHighlighterFactory<BundledLangs, BundledThemes>
46+
47+
// Implementation
48+
export function createdBundledHighlighter<BundledLangs extends string, BundledThemes extends string>(
49+
arg1: Record<BundledLangs, LanguageInput> | CreatedBundledHighlighterOptions<BundledLangs, BundledThemes>,
50+
arg2?: Record<BundledThemes, ThemeInput>,
51+
arg3?: HighlighterCoreOptions['loadWasm'],
2252
): CreateHighlighterFactory<BundledLangs, BundledThemes> {
53+
let bundledLanguages: Record<BundledLangs, LanguageInput>
54+
let bundledThemes: Record<BundledThemes, ThemeInput>
55+
let engine: () => Awaitable<RegexEngine>
56+
57+
if (arg2) {
58+
// TODO: next: console.warn('`createdBundledHighlighter` signature with `bundledLanguages` and `bundledThemes` is deprecated. Use the options object signature instead.')
59+
bundledLanguages = arg1 as Record<BundledLangs, LanguageInput>
60+
bundledThemes = arg2
61+
engine = () => createWasmOnigEngine(arg3)
62+
}
63+
else {
64+
const options = arg1 as CreatedBundledHighlighterOptions<BundledLangs, BundledThemes>
65+
bundledLanguages = options.langs
66+
bundledThemes = options.themes
67+
engine = options.engine
68+
}
69+
2370
async function createHighlighter(
2471
options: BundledHighlighterOptions<BundledLangs, BundledThemes>,
2572
): Promise<HighlighterGeneric<BundledLangs, BundledThemes>> {
@@ -56,7 +103,7 @@ export function createdBundledHighlighter<BundledLangs extends string, BundledTh
56103
...options,
57104
themes: _themes,
58105
langs,
59-
loadWasm,
106+
engine: engine(),
60107
})
61108

62109
return {

‎packages/core/src/types/highlighter.ts

+11-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import type { LanguageInput, LanguageRegistration, ResolveBundleKey, SpecialLang
44
import type { SpecialTheme, ThemeInput, ThemeRegistrationAny, ThemeRegistrationResolved } from './themes'
55
import type { CodeToTokensBaseOptions, CodeToTokensOptions, CodeToTokensWithThemesOptions, GrammarState, ThemedToken, ThemedTokenWithVariants, TokensResult } from './tokens'
66
import type { CodeToHastOptions } from './options'
7-
import type { MaybeArray } from './utils'
7+
import type { Awaitable, MaybeArray } from './utils'
8+
import type { RegexEngine } from './engines'
89

910
/**
1011
* Internal context of Shiki, core textmate logic
@@ -135,3 +136,12 @@ export interface HighlighterGeneric<BundledLangKeys extends string, BundledTheme
135136
* The fine-grained core Shiki highlighter instance.
136137
*/
137138
export type HighlighterCore = HighlighterGeneric<never, never>
139+
140+
/**
141+
* Options for creating a bundled highlighter.
142+
*/
143+
export interface CreatedBundledHighlighterOptions<BundledLangs extends string, BundledThemes extends string> {
144+
langs: Record<BundledLangs, LanguageInput>
145+
themes: Record<BundledThemes, ThemeInput>
146+
engine: () => Awaitable<RegexEngine>
147+
}

‎packages/shiki/src/bundle-full.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { CreateHighlighterFactory, HighlighterGeneric } from '@shikijs/core'
2-
import { createSingletonShorthands, createdBundledHighlighter } from './core'
2+
import { createSingletonShorthands, createWasmOnigEngine, createdBundledHighlighter } from './core'
33
import type { BundledLanguage } from './assets/langs-bundle-full'
44
import type { BundledTheme } from './themes'
55
import { bundledLanguages } from './assets/langs-bundle-full'
@@ -28,11 +28,11 @@ export type Highlighter = HighlighterGeneric<BundledLanguage, BundledTheme>
2828
export const createHighlighter = /* @__PURE__ */ createdBundledHighlighter<
2929
BundledLanguage,
3030
BundledTheme
31-
>(
32-
bundledLanguages,
33-
bundledThemes,
34-
getWasmInlined,
35-
)
31+
>({
32+
langs: bundledLanguages,
33+
themes: bundledThemes,
34+
engine: () => createWasmOnigEngine(getWasmInlined),
35+
})
3636

3737
export const {
3838
codeToHtml,

‎packages/shiki/src/bundle-web.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { CreateHighlighterFactory, HighlighterGeneric } from '@shikijs/core'
2-
import { createSingletonShorthands, createdBundledHighlighter } from './core'
2+
import { createSingletonShorthands, createWasmOnigEngine, createdBundledHighlighter } from './core'
33
import type { BundledLanguage } from './assets/langs-bundle-web'
44
import type { BundledTheme } from './themes'
55
import { bundledLanguages } from './assets/langs-bundle-web'
@@ -28,11 +28,11 @@ export type Highlighter = HighlighterGeneric<BundledLanguage, BundledTheme>
2828
export const createHighlighter = /* @__PURE__ */ createdBundledHighlighter<
2929
BundledLanguage,
3030
BundledTheme
31-
>(
32-
bundledLanguages,
33-
bundledThemes,
34-
getWasmInlined,
35-
)
31+
>({
32+
langs: bundledLanguages,
33+
themes: bundledThemes,
34+
engine: () => createWasmOnigEngine(getWasmInlined),
35+
})
3636

3737
export const {
3838
codeToHtml,

‎packages/twoslash/test/out/classic/compiler_errors.html

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

‎packages/twoslash/test/out/classic/console_log.html

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

‎packages/twoslash/test/out/completion-end-multifile-2.ts.html

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

‎packages/twoslash/test/out/completion-end-multifile-2.ts.json

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

‎packages/twoslash/test/out/completion-end.ts.html

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

‎packages/twoslash/test/out/completion-end.ts.json

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

‎packages/twoslash/test/out/highlights.ts.html

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

‎packages/twoslash/test/out/highlights.ts.json

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

‎packages/vitepress-twoslash/test/fixtures.test.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import { basename } from 'node:path'
2-
import { codeToHast } from 'shiki'
2+
import { codeToHast, getSingletonHighlighter } from 'shiki'
33
import { transformerTwoslash } from '@shikijs/twoslash'
44
import { describe, expect, it } from 'vitest'
55
import { rendererFloatingVue } from '../src'
66

77
const files = import.meta.glob('../../twoslash/test/fixtures/*.*', { as: 'raw', eager: true })
88

9-
describe('fixtures', () => {
9+
describe('fixtures', async () => {
10+
const shiki = await getSingletonHighlighter()
11+
shiki.loadLanguage('js')
12+
1013
for (const file in files) {
1114
const name = basename(file)
1215
it(name, async () => {

‎packages/vitepress-twoslash/test/out/completion-end-multifile-2.ts.json

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

‎packages/vitepress-twoslash/test/out/completion-end.ts.json

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

‎packages/vitepress-twoslash/test/out/highlights.ts.json

+4,366-35
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
Please sign in to comment.