@shikijs/types
Version:
Type definitions for Shiki
852 lines (838 loc) • 29.7 kB
text/typescript
import { Element, Root } from 'hast';
import { OnigScanner, OnigString, IGrammar, IRawGrammar, IRawTheme, IRawThemeSetting, StateStack, FontStyle } from '@shikijs/vscode-textmate';
export { IRawGrammar as RawGrammar, IRawTheme as RawTheme, IRawThemeSetting as RawThemeSetting } from '@shikijs/vscode-textmate';
type Awaitable<T> = T | Promise<T>;
type MaybeGetter<T> = Awaitable<MaybeModule<T>> | (() => Awaitable<MaybeModule<T>>);
type MaybeModule<T> = T | {
default: T;
};
type MaybeArray<T> = T | T[];
type RequireKeys<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
interface Nothing {
}
/**
* type StringLiteralUnion<'foo'> = 'foo' | string
* This has auto completion whereas `'foo' | string` doesn't
* Adapted from https://github.com/microsoft/TypeScript/issues/29729
*/
type StringLiteralUnion<T extends U, U = string> = T | (U & Nothing);
interface PatternScanner extends OnigScanner {
}
interface RegexEngineString extends OnigString {
}
/**
* Engine for RegExp matching and scanning.
*/
interface RegexEngine {
createScanner: (patterns: (string | RegExp)[]) => PatternScanner;
createString: (s: string) => RegexEngineString;
}
interface WebAssemblyInstantiator {
(importObject: Record<string, Record<string, WebAssembly.ImportValue>> | undefined): Promise<WebAssemblyInstance>;
}
type WebAssemblyInstance = WebAssembly.WebAssemblyInstantiatedSource | WebAssembly.Instance | WebAssembly.Instance['exports'];
type OnigurumaLoadOptions = {
instantiator: WebAssemblyInstantiator;
} | {
default: WebAssemblyInstantiator;
} | {
data: ArrayBufferView | ArrayBuffer | Response;
};
type LoadWasmOptionsPlain = OnigurumaLoadOptions | WebAssemblyInstantiator | ArrayBufferView | ArrayBuffer | Response;
type LoadWasmOptions = Awaitable<LoadWasmOptionsPlain> | (() => Awaitable<LoadWasmOptionsPlain>);
interface Grammar extends IGrammar {
name: string;
}
type PlainTextLanguage = 'text' | 'plaintext' | 'txt';
type AnsiLanguage = 'ansi';
type SpecialLanguage = PlainTextLanguage | AnsiLanguage;
type LanguageInput = MaybeGetter<MaybeArray<LanguageRegistration>>;
type ResolveBundleKey<T extends string> = [T] extends [never] ? string : T;
interface LanguageRegistration extends IRawGrammar {
name: string;
scopeName: string;
displayName?: string;
aliases?: string[];
/**
* A list of languages the current language embeds.
* If manually specifying languages to load, make sure to load the embedded
* languages for each parent language.
*/
embeddedLangs?: string[];
/**
* A list of languages that embed the current language.
* Unlike `embeddedLangs`, the embedded languages will not be loaded automatically.
*/
embeddedLangsLazy?: string[];
balancedBracketSelectors?: string[];
unbalancedBracketSelectors?: string[];
foldingStopMarker?: string;
foldingStartMarker?: string;
/**
* Inject this language to other scopes.
* Same as `injectTo` in VSCode's `contributes.grammars`.
*
* @see https://code.visualstudio.com/api/language-extensions/syntax-highlight-guide#injection-grammars
*/
injectTo?: string[];
}
interface BundledLanguageInfo {
id: string;
name: string;
import: DynamicImportLanguageRegistration;
aliases?: string[];
}
type DynamicImportLanguageRegistration = () => Promise<{
default: LanguageRegistration[];
}>;
interface DecorationOptions {
/**
* Custom decorations to wrap highlighted tokens with.
*/
decorations?: DecorationItem[];
}
interface DecorationItem {
/**
* Start offset or position of the decoration.
*/
start: OffsetOrPosition;
/**
* End offset or position of the decoration.
*/
end: OffsetOrPosition;
/**
* Tag name of the element to create.
* @default 'span'
*/
tagName?: string;
/**
* Properties of the element to create.
*/
properties?: Element['properties'];
/**
* A custom function to transform the element after it has been created.
*/
transform?: (element: Element, type: DecorationTransformType) => Element | void;
/**
* By default when the decoration contains only one token, the decoration will be applied to the token.
*
* Set to `true` to always wrap the token with a new element
*
* @default false
*/
alwaysWrap?: boolean;
}
interface ResolvedDecorationItem extends Omit<DecorationItem, 'start' | 'end'> {
start: ResolvedPosition;
end: ResolvedPosition;
}
type DecorationTransformType = 'wrapper' | 'line' | 'token';
interface Position {
line: number;
character: number;
}
type Offset = number;
type OffsetOrPosition = Position | Offset;
interface ResolvedPosition extends Position {
offset: Offset;
}
type SpecialTheme = 'none';
type ThemeInput = MaybeGetter<ThemeRegistrationAny>;
interface ThemeRegistrationRaw extends IRawTheme, Partial<Omit<ThemeRegistration, 'name' | 'settings'>> {
}
interface ThemeRegistration extends Partial<ThemeRegistrationResolved> {
}
interface ThemeRegistrationResolved extends IRawTheme {
/**
* Theme name
*/
name: string;
/**
* Display name
*
* @field shiki custom property
*/
displayName?: string;
/**
* Light/dark theme
*
* @field shiki custom property
*/
type: 'light' | 'dark';
/**
* Token rules
*/
settings: IRawThemeSetting[];
/**
* Same as `settings`, will use as fallback if `settings` is not present.
*/
tokenColors?: IRawThemeSetting[];
/**
* Default foreground color
*
* @field shiki custom property
*/
fg: string;
/**
* Background color
*
* @field shiki custom property
*/
bg: string;
/**
* A map of color names to new color values.
*
* The color key starts with '#' and should be lowercased.
*
* @field shiki custom property
*/
colorReplacements?: Record<string, string>;
/**
* Color map of VS Code options
*
* Will be used by shiki on `lang: 'ansi'` to find ANSI colors, and to find the default foreground/background colors.
*/
colors?: Record<string, string>;
/**
* JSON schema path
*
* @field not used by shiki
*/
$schema?: string;
/**
* Enable semantic highlighting
*
* @field not used by shiki
*/
semanticHighlighting?: boolean;
/**
* Tokens for semantic highlighting
*
* @field not used by shiki
*/
semanticTokenColors?: Record<string, string>;
}
type ThemeRegistrationAny = ThemeRegistrationRaw | ThemeRegistration | ThemeRegistrationResolved;
type DynamicImportThemeRegistration = () => Promise<{
default: ThemeRegistration;
}>;
interface BundledThemeInfo {
id: string;
displayName: string;
type: 'light' | 'dark';
import: DynamicImportThemeRegistration;
}
/**
* GrammarState is a special reference object that holds the state of a grammar.
*
* It's used to highlight code snippets that are part of the target language.
*/
interface GrammarState {
readonly lang: string;
readonly theme: string;
readonly themes: string[];
/**
* @internal
*/
getInternalStack: (theme?: string) => StateStack | undefined;
getScopes: (theme?: string) => string[] | undefined;
}
interface CodeToTokensBaseOptions<Languages extends string = string, Themes extends string = string> extends TokenizeWithThemeOptions {
lang?: Languages | SpecialLanguage;
theme?: Themes | ThemeRegistrationAny | SpecialTheme;
}
type CodeToTokensOptions<Languages extends string = string, Themes extends string = string> = Omit<CodeToTokensBaseOptions<Languages, Themes>, 'theme'> & CodeOptionsThemes<Themes>;
interface CodeToTokensWithThemesOptions<Languages = string, Themes = string> extends TokenizeWithThemeOptions {
lang?: Languages | SpecialLanguage;
/**
* A map of color names to themes.
*
* `light` and `dark` are required, and arbitrary color names can be added.
*
* @example
* ```ts
* themes: {
* light: 'vitesse-light',
* dark: 'vitesse-dark',
* soft: 'nord',
* // custom colors
* }
* ```
*/
themes: Partial<Record<string, Themes | ThemeRegistrationAny | SpecialTheme>>;
}
interface ThemedTokenScopeExplanation {
scopeName: string;
themeMatches?: IRawThemeSetting[];
}
interface ThemedTokenExplanation {
content: string;
scopes: ThemedTokenScopeExplanation[];
}
/**
* A single token with color, and optionally with explanation.
*
* For example:
*
* ```json
* {
* "content": "shiki",
* "color": "#D8DEE9",
* "explanation": [
* {
* "content": "shiki",
* "scopes": [
* {
* "scopeName": "source.js",
* "themeMatches": []
* },
* {
* "scopeName": "meta.objectliteral.js",
* "themeMatches": []
* },
* {
* "scopeName": "meta.object.member.js",
* "themeMatches": []
* },
* {
* "scopeName": "meta.array.literal.js",
* "themeMatches": []
* },
* {
* "scopeName": "variable.other.object.js",
* "themeMatches": [
* {
* "name": "Variable",
* "scope": "variable.other",
* "settings": {
* "foreground": "#D8DEE9"
* }
* },
* {
* "name": "[JavaScript] Variable Other Object",
* "scope": "source.js variable.other.object",
* "settings": {
* "foreground": "#D8DEE9"
* }
* }
* ]
* }
* ]
* }
* ]
* }
* ```
*/
interface ThemedToken extends TokenStyles, TokenBase {
}
interface TokenBase {
/**
* The content of the token
*/
content: string;
/**
* The start offset of the token, relative to the input code. 0-indexed.
*/
offset: number;
/**
* Explanation of
*
* - token text's matching scopes
* - reason that token text is given a color (one matching scope matches a rule (scope -> color) in the theme)
*/
explanation?: ThemedTokenExplanation[];
}
interface TokenStyles {
/**
* 6 or 8 digit hex code representation of the token's color
*/
color?: string;
/**
* 6 or 8 digit hex code representation of the token's background color
*/
bgColor?: string;
/**
* Font style of token. Can be None/Italic/Bold/Underline
*/
fontStyle?: FontStyle;
/**
* Override with custom inline style for HTML renderer.
* When specified, `color` and `fontStyle` will be ignored.
* Prefer use object style for merging with other styles.
*/
htmlStyle?: Record<string, string>;
/**
* Extra HTML attributes for the token.
*/
htmlAttrs?: Record<string, string>;
}
interface ThemedTokenWithVariants extends TokenBase {
/**
* An object of color name to token styles
*/
variants: Record<string, TokenStyles>;
}
interface TokenizeWithThemeOptions {
/**
* Include explanation of why a token is given a color.
*
* You can optionally pass `scopeName` to only include explanation for scopes,
* which is more performant than full explanation.
*
* @default false
*/
includeExplanation?: boolean | 'scopeName';
/**
* A map of color names to new color values.
*
* The color key starts with '#' and should be lowercased.
*
* This will be merged with theme's `colorReplacements` if any.
*/
colorReplacements?: Record<string, string | Record<string, string>>;
/**
* Lines above this length will not be tokenized for performance reasons.
*
* @default 0 (no limit)
*/
tokenizeMaxLineLength?: number;
/**
* Time limit in milliseconds for tokenizing a single line.
*
* @default 500 (0.5s)
*/
tokenizeTimeLimit?: number;
/**
* Represent the state of the grammar, allowing to continue tokenizing from a intermediate grammar state.
*
* You can get the grammar state from `getLastGrammarState`.
*/
grammarState?: GrammarState;
/**
* The code context of the grammar.
* Consider it a prepended code to the input code, that only participate the grammar inference but not presented in the final output.
*
* This will be ignored if `grammarState` is provided.
*/
grammarContextCode?: string;
}
/**
* Result of `codeToTokens`, an object with 2D array of tokens and meta info like background and foreground color.
*/
interface TokensResult {
/**
* 2D array of tokens, first dimension is lines, second dimension is tokens in a line.
*/
tokens: ThemedToken[][];
/**
* Foreground color of the code.
*/
fg?: string;
/**
* Background color of the code.
*/
bg?: string;
/**
* A string representation of themes applied to the token.
*/
themeName?: string;
/**
* Custom style string to be applied to the root `<pre>` element.
* When specified, `fg` and `bg` will be ignored.
*/
rootStyle?: string;
/**
* The last grammar state of the code snippet.
*/
grammarState?: GrammarState;
}
interface TransformerOptions {
/**
* Transformers for the Shiki pipeline.
*/
transformers?: ShikiTransformer[];
}
interface ShikiTransformerContextMeta {
}
/**
* Common transformer context for all transformers hooks
*/
interface ShikiTransformerContextCommon {
meta: ShikiTransformerContextMeta;
options: CodeToHastOptions;
codeToHast: (code: string, options: CodeToHastOptions) => Root;
codeToTokens: (code: string, options: CodeToTokensOptions) => TokensResult;
}
interface ShikiTransformerContextSource extends ShikiTransformerContextCommon {
readonly source: string;
}
/**
* Transformer context for HAST related hooks
*/
interface ShikiTransformerContext extends ShikiTransformerContextSource {
readonly tokens: ThemedToken[][];
readonly root: Root;
readonly pre: Element;
readonly code: Element;
readonly lines: Element[];
readonly structure: CodeToHastOptions['structure'];
/**
* Utility to append class to a hast node
*
* If the `property.class` is a string, it will be splitted by space and converted to an array.
*/
addClassToHast: (hast: Element, className: string | string[]) => Element;
}
interface ShikiTransformer {
/**
* Name of the transformer
*/
name?: string;
/**
* Transform the raw input code before passing to the highlighter.
*/
preprocess?: (this: ShikiTransformerContextCommon, code: string, options: CodeToHastOptions) => string | void;
/**
* Transform the full tokens list before converting to HAST.
* Return a new tokens list will replace the original one.
*/
tokens?: (this: ShikiTransformerContextSource, tokens: ThemedToken[][]) => ThemedToken[][] | void;
/**
* Transform the entire generated HAST tree. Return a new Node will replace the original one.
*/
root?: (this: ShikiTransformerContext, hast: Root) => Root | void;
/**
* Transform the `<pre>` element. Return a new Node will replace the original one.
*/
pre?: (this: ShikiTransformerContext, hast: Element) => Element | void;
/**
* Transform the `<code>` element. Return a new Node will replace the original one.
*/
code?: (this: ShikiTransformerContext, hast: Element) => Element | void;
/**
* Transform each line `<span class="line">` element.
*
* @param hast
* @param line 1-based line number
*/
line?: (this: ShikiTransformerContext, hast: Element, line: number) => Element | void;
/**
* Transform each token `<span>` element.
*/
span?: (this: ShikiTransformerContext, hast: Element, line: number, col: number, lineElement: Element, token: ThemedToken) => Element | void;
/**
* Transform the generated HTML string before returning.
* This hook will only be called with `codeToHtml`.
*/
postprocess?: (this: ShikiTransformerContextCommon, html: string, options: CodeToHastOptions) => string | void;
}
interface HighlighterCoreOptions<Sync extends boolean = false> {
/**
* Custom RegExp engine.
*/
engine: Sync extends true ? RegexEngine : Awaitable<RegexEngine>;
/**
* Theme names, or theme registration objects to be loaded upfront.
*/
themes?: Sync extends true ? MaybeArray<ThemeRegistrationAny>[] : ThemeInput[];
/**
* Language names, or language registration objects to be loaded upfront.
*/
langs?: Sync extends true ? MaybeArray<LanguageRegistration>[] : LanguageInput[];
/**
* Alias of languages
* @example { 'my-lang': 'javascript' }
*/
langAlias?: Record<string, string>;
/**
* Emit console warnings to alert users of potential issues.
* @default true
*/
warnings?: boolean;
}
interface BundledHighlighterOptions<L extends string, T extends string> extends Pick<HighlighterCoreOptions, 'warnings'> {
/**
* Custom RegExp engine.
*/
engine?: Awaitable<RegexEngine>;
/**
* Theme registation
*
* @default []
*/
themes: (ThemeInput | StringLiteralUnion<T> | SpecialTheme)[];
/**
* Language registation
*
* @default []
*/
langs: (LanguageInput | StringLiteralUnion<L> | SpecialLanguage)[];
/**
* Alias of languages
* @example { 'my-lang': 'javascript' }
*/
langAlias?: Record<string, StringLiteralUnion<L>>;
}
interface CodeOptionsSingleTheme<Themes extends string = string> {
theme: ThemeRegistrationAny | StringLiteralUnion<Themes>;
}
interface CodeOptionsMultipleThemes<Themes extends string = string> {
/**
* A map of color names to themes.
* This allows you to specify multiple themes for the generated code.
*
* ```ts
* highlighter.codeToHtml(code, {
* lang: 'js',
* themes: {
* light: 'vitesse-light',
* dark: 'vitesse-dark',
* }
* })
* ```
*
* Will generate:
*
* ```html
* <span style="color:#111;--shiki-dark:#fff;">code</span>
* ```
*
* @see https://github.com/shikijs/shiki#lightdark-dual-themes
*/
themes: Partial<Record<string, ThemeRegistrationAny | StringLiteralUnion<Themes>>>;
/**
* The default theme applied to the code (via inline `color` style).
* The rest of the themes are applied via CSS variables, and toggled by CSS overrides.
*
* For example, if `defaultColor` is `light`, then `light` theme is applied to the code,
* and the `dark` theme and other custom themes are applied via CSS variables:
*
* ```html
* <span style="color:#{light};--shiki-dark:#{dark};--shiki-custom:#{custom};">code</span>
* ```
*
* When set to `false`, no default styles will be applied, and totally up to users to apply the styles:
*
* ```html
* <span style="--shiki-light:#{light};--shiki-dark:#{dark};--shiki-custom:#{custom};">code</span>
* ```
*
* When set to `light-dark()`, the default color will be rendered as `light-dark(#{light}, #{dark})`.
*
* ```html
* <span style="color:light-dark(#{light}, #{dark});--shiki-dark:#{dark};--shiki-custom:#{custom};">code</span>
* ```
*
* @default 'light'
*/
defaultColor?: StringLiteralUnion<'light' | 'dark'> | 'light-dark()' | false;
/**
* The strategy to render multiple colors.
*
* - `css-vars`: Render the colors via CSS variables.
* - `none`: Do not render the colors, only use the default color.
*
* @default 'css-vars'
*/
colorsRendering?: 'css-vars' | 'none';
/**
* Prefix of CSS variables used to store the color of the other theme.
*
* @default '--shiki-'
*/
cssVariablePrefix?: string;
}
type CodeOptionsThemes<Themes extends string = string> = CodeOptionsSingleTheme<Themes> | CodeOptionsMultipleThemes<Themes>;
type CodeToHastOptions<Languages extends string = string, Themes extends string = string> = CodeToHastOptionsCommon<Languages> & CodeOptionsThemes<Themes> & CodeOptionsMeta;
interface CodeToHastOptionsCommon<Languages extends string = string> extends TransformerOptions, DecorationOptions, Pick<TokenizeWithThemeOptions, 'colorReplacements' | 'tokenizeMaxLineLength' | 'tokenizeTimeLimit' | 'grammarState' | 'grammarContextCode'> {
lang: StringLiteralUnion<Languages | SpecialLanguage>;
/**
* Merge whitespace tokens to saving extra `<span>`.
*
* When set to true, it will merge whitespace tokens with the next token.
* When set to false, it keep the output as-is.
* When set to `never`, it will force to separate leading and trailing spaces from tokens.
*
* @default true
*/
mergeWhitespaces?: boolean | 'never';
/**
* Merge consecutive tokens with the same style to reduce the number of DOM nodes.
* This can improve rendering performance but may affect the structure of the output.
*
* @default false
*/
mergeSameStyleTokens?: boolean;
/**
* The structure of the generated HAST and HTML.
*
* - `classic`: The classic structure with `<pre>` and `<code>` elements, each line wrapped with a `<span class="line">` element.
* - `inline`: All tokens are rendered as `<span>`, line breaks are rendered as `<br>`. No `<pre>` or `<code>` elements. Default forground and background colors are not applied.
*
* @default 'classic'
*/
structure?: 'classic' | 'inline';
/**
* Tab index of the root `<pre>` element.
*
* Set to `false` to disable tab index.
*
* @default 0
*/
tabindex?: number | string | false;
}
interface CodeOptionsMeta {
/**
* Meta data passed to Shiki, usually used by plugin integrations to pass the code block header.
*
* Key values in meta will be serialized to the attributes of the root `<pre>` element.
*
* Keys starting with `_` will be ignored.
*
* A special key `__raw` key will be used to pass the raw code block header (if the integration supports it).
*/
meta?: {
/**
* Raw string of the code block header.
*/
__raw?: string;
[key: string]: any;
};
}
interface CodeToHastRenderOptionsCommon extends TransformerOptions, Omit<TokensResult, 'tokens'> {
lang?: string;
langId?: string;
}
type CodeToHastRenderOptions = CodeToHastRenderOptionsCommon & CodeToHastOptions;
/**
* Type of object that can be bound to a grammar state
*/
type GrammarStateMapKey = Root | ThemedToken[][];
/**
* Internal context of Shiki, core textmate logic
*/
interface ShikiInternal<BundledLangKeys extends string = never, BundledThemeKeys extends string = never> {
/**
* Load a theme to the highlighter, so later it can be used synchronously.
*/
loadTheme: (...themes: (ThemeInput | BundledThemeKeys | SpecialTheme)[]) => Promise<void>;
/**
* Load a theme registration synchronously.
*/
loadThemeSync: (...themes: MaybeArray<ThemeRegistrationAny>[]) => void;
/**
* Load a language to the highlighter, so later it can be used synchronously.
*/
loadLanguage: (...langs: (LanguageInput | BundledLangKeys | SpecialLanguage)[]) => Promise<void>;
/**
* Load a language registration synchronously.
*/
loadLanguageSync: (...langs: MaybeArray<LanguageRegistration>[]) => void;
/**
* Get the registered theme object
*/
getTheme: (name: string | ThemeRegistrationAny) => ThemeRegistrationResolved;
/**
* Get the registered language object
*/
getLanguage: (name: string | LanguageRegistration) => Grammar;
/**
* Set the current theme and get the resolved theme object and color map.
* @internal
*/
setTheme: (themeName: string | ThemeRegistrationAny) => {
theme: ThemeRegistrationResolved;
colorMap: string[];
};
/**
* Get the names of loaded languages
*
* Special-handled languages like `text`, `plain` and `ansi` are not included.
*/
getLoadedLanguages: () => string[];
/**
* Get the names of loaded themes
*
* Special-handled themes like `none` are not included.
*/
getLoadedThemes: () => string[];
/**
* Dispose the internal registry and release resources
*/
dispose: () => void;
/**
* Dispose the internal registry and release resources
*/
[Symbol.dispose]: () => void;
}
/**
* Generic instance interface of Shiki
*/
interface HighlighterGeneric<BundledLangKeys extends string, BundledThemeKeys extends string> extends ShikiInternal<BundledLangKeys, BundledThemeKeys> {
/**
* Get highlighted code in HTML string
*/
codeToHtml: (code: string, options: CodeToHastOptions<ResolveBundleKey<BundledLangKeys>, ResolveBundleKey<BundledThemeKeys>>) => string;
/**
* Get highlighted code in HAST.
* @see https://github.com/syntax-tree/hast
*/
codeToHast: (code: string, options: CodeToHastOptions<ResolveBundleKey<BundledLangKeys>, ResolveBundleKey<BundledThemeKeys>>) => Root;
/**
* Get highlighted code in tokens. Uses `codeToTokensWithThemes` or `codeToTokensBase` based on the options.
*/
codeToTokens: (code: string, options: CodeToTokensOptions<ResolveBundleKey<BundledLangKeys>, ResolveBundleKey<BundledThemeKeys>>) => TokensResult;
/**
* Get highlighted code in tokens with a single theme.
* @returns A 2D array of tokens, first dimension is lines, second dimension is tokens in a line.
*/
codeToTokensBase: (code: string, options: CodeToTokensBaseOptions<ResolveBundleKey<BundledLangKeys>, ResolveBundleKey<BundledThemeKeys>>) => ThemedToken[][];
/**
* Get highlighted code in tokens with multiple themes.
*
* Different from `codeToTokensBase`, each token will have a `variants` property consisting of an object of color name to token styles.
*
* @returns A 2D array of tokens, first dimension is lines, second dimension is tokens in a line.
*/
codeToTokensWithThemes: (code: string, options: CodeToTokensWithThemesOptions<ResolveBundleKey<BundledLangKeys>, ResolveBundleKey<BundledThemeKeys>>) => ThemedTokenWithVariants[][];
/**
* Get the last grammar state of a code snippet.
* You can pass the grammar state to `codeToTokens` as `grammarState` to continue tokenizing from an intermediate state.
*/
getLastGrammarState: {
(element: GrammarStateMapKey, options?: never): GrammarState | undefined;
(code: string, options: CodeToTokensBaseOptions<ResolveBundleKey<BundledLangKeys>, ResolveBundleKey<BundledThemeKeys>>): GrammarState;
};
/**
* Get internal context object
* @internal
* @deprecated
*/
getInternalContext: () => ShikiInternal;
/**
* Get bundled languages object
*/
getBundledLanguages: () => Record<BundledLangKeys, LanguageInput>;
/**
* Get bundled themes object
*/
getBundledThemes: () => Record<BundledThemeKeys, ThemeInput>;
}
/**
* The fine-grained core Shiki highlighter instance.
*/
type HighlighterCore = HighlighterGeneric<never, never>;
/**
* Options for creating a bundled highlighter.
*/
interface CreatedBundledHighlighterOptions<BundledLangs extends string, BundledThemes extends string> {
langs: Record<BundledLangs, LanguageInput>;
themes: Record<BundledThemes, ThemeInput>;
engine: () => Awaitable<RegexEngine>;
}
type CreateHighlighterFactory<L extends string, T extends string> = (options: BundledHighlighterOptions<L, T>) => Promise<HighlighterGeneric<L, T>>;
declare class ShikiError extends Error {
constructor(message: string);
}
export { ShikiError };
export type { AnsiLanguage, Awaitable, BundledHighlighterOptions, BundledLanguageInfo, BundledThemeInfo, CodeOptionsMeta, CodeOptionsMultipleThemes, CodeOptionsSingleTheme, CodeOptionsThemes, CodeToHastOptions, CodeToHastOptionsCommon, CodeToHastRenderOptions, CodeToHastRenderOptionsCommon, CodeToTokensBaseOptions, CodeToTokensOptions, CodeToTokensWithThemesOptions, CreateHighlighterFactory, CreatedBundledHighlighterOptions, DecorationItem, DecorationOptions, DecorationTransformType, DynamicImportLanguageRegistration, DynamicImportThemeRegistration, Grammar, GrammarState, GrammarStateMapKey, HighlighterCore, HighlighterCoreOptions, HighlighterGeneric, LanguageInput, LanguageRegistration, LoadWasmOptions, LoadWasmOptionsPlain, MaybeArray, MaybeGetter, MaybeModule, Offset, OffsetOrPosition, OnigurumaLoadOptions, PatternScanner, PlainTextLanguage, Position, RegexEngine, RegexEngineString, RequireKeys, ResolveBundleKey, ResolvedDecorationItem, ResolvedPosition, ShikiInternal, ShikiTransformer, ShikiTransformerContext, ShikiTransformerContextCommon, ShikiTransformerContextMeta, ShikiTransformerContextSource, SpecialLanguage, SpecialTheme, StringLiteralUnion, ThemeInput, ThemeRegistration, ThemeRegistrationAny, ThemeRegistrationRaw, ThemeRegistrationResolved, ThemedToken, ThemedTokenExplanation, ThemedTokenScopeExplanation, ThemedTokenWithVariants, TokenBase, TokenStyles, TokenizeWithThemeOptions, TokensResult, TransformerOptions, WebAssemblyInstance, WebAssemblyInstantiator };