/* Yoinked from https://github.com/highlightjs/highlight.js/blob/main/types/index.d.ts */ /* eslint-disable no-unused-vars */ /* eslint-disable no-use-before-define */ // For TS consumers who use Node and don't have dom in their tsconfig lib, import the necessary types here. /// declare module 'highlight.js/private' { import { CompiledMode, Mode, Language } from 'highlight.js' type MatchType = 'begin' | 'end' | 'illegal' type EnhancedMatch = RegExpMatchArray & { rule: CompiledMode type: MatchType } type AnnotatedError = Error & { mode?: Mode | Language languageName?: string badRule?: Mode } type KeywordData = [string, number] type KeywordDict = Record } declare module 'highlight.js' { import { KeywordDict } from 'highlight.js/private' export type HLJSApi = PublicApi & ModesAPI export interface VuePlugin { install: (vue: any) => void } // perhaps make this an interface? type RegexEitherOptions = { capture?: boolean } interface PublicApi { highlight: ( codeOrLanguageName: string, optionsOrCode: string | HighlightOptions, ignoreIllegals?: boolean ) => HighlightResult highlightAuto: ( code: string, languageSubset?: string[] ) => AutoHighlightResult highlightBlock: (element: HTMLElement) => void highlightElement: (element: HTMLElement) => void configure: (options: Partial) => void initHighlighting: () => void initHighlightingOnLoad: () => void highlightAll: () => void registerLanguage: (languageName: string, language: LanguageFn) => void unregisterLanguage: (languageName: string) => void listLanguages: () => string[] registerAliases: ( aliasList: string | string[], { languageName }: { languageName: string } ) => void getLanguage: (languageName: string) => Language | undefined autoDetection: (languageName: string) => boolean inherit: (original: T, ...args: Record[]) => T addPlugin: (plugin: HLJSPlugin) => void removePlugin: (plugin: HLJSPlugin) => void debugMode: () => void safeMode: () => void versionString: string vuePlugin: () => VuePlugin regex: { concat: (...args: (RegExp | string)[]) => string lookahead: (re: RegExp | string) => string either: ( ...args: | (RegExp | string)[] | [...(RegExp | string)[], RegexEitherOptions] ) => string optional: (re: RegExp | string) => string anyNumberOfTimes: (re: RegExp | string) => string } newInstance: () => HLJSApi } interface ModesAPI { SHEBANG: (mode?: Partial & { binary?: string | RegExp }) => Mode BACKSLASH_ESCAPE: Mode QUOTE_STRING_MODE: Mode APOS_STRING_MODE: Mode PHRASAL_WORDS_MODE: Mode COMMENT: ( begin: string | RegExp, end: string | RegExp, modeOpts?: Mode | {} ) => Mode C_LINE_COMMENT_MODE: Mode C_BLOCK_COMMENT_MODE: Mode HASH_COMMENT_MODE: Mode NUMBER_MODE: Mode C_NUMBER_MODE: Mode BINARY_NUMBER_MODE: Mode REGEXP_MODE: Mode TITLE_MODE: Mode UNDERSCORE_TITLE_MODE: Mode METHOD_GUARD: Mode END_SAME_AS_BEGIN: (mode: Mode) => Mode // built in regex IDENT_RE: string UNDERSCORE_IDENT_RE: string MATCH_NOTHING_RE: string NUMBER_RE: string C_NUMBER_RE: string BINARY_NUMBER_RE: string RE_STARTERS_RE: string } export type LanguageFn = (hljs: HLJSApi) => Language export type CompilerExt = (mode: Mode, parent: Mode | Language | null) => void export interface HighlightResult { code?: string relevance: number value: string language?: string illegal: boolean errorRaised?: Error // * for auto-highlight secondBest?: Omit // private _illegalBy?: illegalData _emitter: Emitter _top?: Language | CompiledMode } export interface AutoHighlightResult extends HighlightResult {} export interface illegalData { message: string context: string index: number resultSoFar: string mode: CompiledMode } export type BeforeHighlightContext = { code: string language: string result?: HighlightResult } export type PluginEvent = keyof HLJSPlugin export type HLJSPlugin = { 'after:highlight'?: (result: HighlightResult) => void 'before:highlight'?: (context: BeforeHighlightContext) => void 'after:highlightElement'?: (data: { el: Element result: HighlightResult text: string }) => void 'before:highlightElement'?: (data: { el: Element language: string }) => void // TODO: Old API, remove with v12 'after:highlightBlock'?: (data: { block: Element result: HighlightResult text: string }) => void 'before:highlightBlock'?: (data: { block: Element language: string }) => void } interface EmitterConstructor { new (opts: any): Emitter } export interface HighlightOptions { language: string ignoreIllegals?: boolean } export interface HLJSOptions { noHighlightRe: RegExp languageDetectRe: RegExp classPrefix: string cssSelector: string languages?: string[] __emitter: EmitterConstructor ignoreUnescapedHTML?: boolean throwUnescapedHTML?: boolean } export interface CallbackResponse { data: Record ignoreMatch: () => void isMatchIgnored: boolean } export type ModeCallback = ( match: RegExpMatchArray, response: CallbackResponse ) => void export type Language = LanguageDetail & Partial export interface Mode extends ModeCallbacks, ModeDetails {} export interface LanguageDetail { name?: string unicodeRegex?: boolean rawDefinition?: () => Language aliases?: string[] disableAutodetect?: boolean contains: Mode[] case_insensitive?: boolean keywords?: string | string[] | Record isCompiled?: boolean exports?: any classNameAliases?: Record compilerExtensions?: CompilerExt[] supersetOf?: string } // technically private, but exported for convenience as this has // been a pretty stable API and is quite useful export interface Emitter { startScope(name: string): void endScope(): void addText(text: string): void toHTML(): string finalize(): void __addSublanguage(emitter: Emitter, subLanguageName: string): void } export type HighlightedHTMLElement = HTMLElement & { result?: object secondBest?: object parentNode: HTMLElement } /* modes */ interface ModeCallbacks { 'on:end'?: Function 'on:begin'?: ModeCallback } export interface CompiledLanguage extends LanguageDetail, CompiledMode { isCompiled: true contains: CompiledMode[] keywords: Record } export type CompiledScope = Record & { _emit?: Record _multi?: boolean _wrap?: string } export type CompiledMode = Omit & { begin?: RegExp | string end?: RegExp | string scope?: string contains: CompiledMode[] keywords: KeywordDict data: Record terminatorEnd: string keywordPatternRe: RegExp beginRe: RegExp endRe: RegExp illegalRe: RegExp matcher: any isCompiled: true starts?: CompiledMode parent?: CompiledMode beginScope?: CompiledScope endScope?: CompiledScope } interface ModeDetails { begin?: RegExp | string | (RegExp | string)[] match?: RegExp | string | (RegExp | string)[] end?: RegExp | string | (RegExp | string)[] // deprecated in favor of `scope` className?: string scope?: string | Record beginScope?: string | Record endScope?: string | Record contains?: ('self' | Mode)[] endsParent?: boolean endsWithParent?: boolean endSameAsBegin?: boolean skip?: boolean excludeBegin?: boolean excludeEnd?: boolean returnBegin?: boolean returnEnd?: boolean __beforeBegin?: Function parent?: Mode starts?: Mode lexemes?: string | RegExp keywords?: string | string[] | Record beginKeywords?: string relevance?: number illegal?: string | RegExp | Array variants?: Mode[] cachedVariants?: Mode[] // parsed subLanguage?: string | string[] isCompiled?: boolean label?: string } const hljs: HLJSApi export default hljs } declare module 'highlight.js/lib/languages/*' { import { LanguageFn } from 'highlight.js' const defineLanguage: LanguageFn export default defineLanguage }