@pierre/diffs 1.6.0-beta.1 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/CodeView.d.ts +3 -2
- package/dist/components/CodeView.d.ts.map +1 -1
- package/dist/components/CodeView.js +18 -14
- package/dist/components/CodeView.js.map +1 -1
- package/dist/components/File.d.ts +31 -9
- package/dist/components/File.d.ts.map +1 -1
- package/dist/components/File.js +165 -84
- package/dist/components/File.js.map +1 -1
- package/dist/components/FileDiff.d.ts +32 -9
- package/dist/components/FileDiff.d.ts.map +1 -1
- package/dist/components/FileDiff.js +213 -124
- package/dist/components/FileDiff.js.map +1 -1
- package/dist/components/UnresolvedFile.d.ts +14 -4
- package/dist/components/UnresolvedFile.d.ts.map +1 -1
- package/dist/components/UnresolvedFile.js +35 -16
- package/dist/components/UnresolvedFile.js.map +1 -1
- package/dist/components/VirtualizedFile.d.ts +3 -2
- package/dist/components/VirtualizedFile.d.ts.map +1 -1
- package/dist/components/VirtualizedFile.js +28 -20
- package/dist/components/VirtualizedFile.js.map +1 -1
- package/dist/components/VirtualizedFileDiff.d.ts +3 -2
- package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
- package/dist/components/VirtualizedFileDiff.js +31 -24
- package/dist/components/VirtualizedFileDiff.js.map +1 -1
- package/dist/constants.d.ts +2 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -1
- package/dist/constants.js.map +1 -1
- package/dist/editor/platform.d.ts +1 -1
- package/dist/editor/platform.js +5 -4
- package/dist/editor/platform.js.map +1 -1
- package/dist/editor/selection.d.ts +2 -2
- package/dist/editor/selection.d.ts.map +1 -1
- package/dist/editor/selection.js +31 -6
- package/dist/editor/selection.js.map +1 -1
- package/dist/highlighter/shared_highlighter.d.ts +2 -1
- package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
- package/dist/highlighter/shared_highlighter.js +2 -2
- package/dist/highlighter/shared_highlighter.js.map +1 -1
- package/dist/index.d.ts +10 -5
- package/dist/index.js +8 -3
- package/dist/react/CodeView.d.ts +4 -3
- package/dist/react/CodeView.d.ts.map +1 -1
- package/dist/react/CodeView.js +48 -39
- package/dist/react/CodeView.js.map +1 -1
- package/dist/react/File.js +3 -3
- package/dist/react/File.js.map +1 -1
- package/dist/react/FileDiff.js +3 -3
- package/dist/react/FileDiff.js.map +1 -1
- package/dist/react/MultiFileDiff.js +2 -2
- package/dist/react/MultiFileDiff.js.map +1 -1
- package/dist/react/PatchDiff.js +3 -3
- package/dist/react/PatchDiff.js.map +1 -1
- package/dist/react/UnresolvedFile.js +2 -2
- package/dist/react/UnresolvedFile.js.map +1 -1
- package/dist/react/index.d.ts +2 -2
- package/dist/react/types.d.ts +4 -2
- package/dist/react/types.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.js +1 -1
- package/dist/react/utils/renderDiffChildren.js.map +1 -1
- package/dist/react/utils/renderFileChildren.js +1 -1
- package/dist/react/utils/renderFileChildren.js.map +1 -1
- package/dist/react/utils/useFileDiffInstance.d.ts +1 -0
- package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
- package/dist/react/utils/useFileDiffInstance.js +29 -24
- package/dist/react/utils/useFileDiffInstance.js.map +1 -1
- package/dist/react/utils/useFileInstance.d.ts +2 -0
- package/dist/react/utils/useFileInstance.d.ts.map +1 -1
- package/dist/react/utils/useFileInstance.js +38 -28
- package/dist/react/utils/useFileInstance.js.map +1 -1
- package/dist/react/utils/useForceUpdate.d.ts +5 -0
- package/dist/react/utils/useForceUpdate.d.ts.map +1 -0
- package/dist/react/utils/useForceUpdate.js +27 -0
- package/dist/react/utils/useForceUpdate.js.map +1 -0
- package/dist/react/utils/useNextRenderData.d.ts +9 -0
- package/dist/react/utils/useNextRenderData.d.ts.map +1 -0
- package/dist/react/utils/useNextRenderData.js +9 -0
- package/dist/react/utils/useNextRenderData.js.map +1 -0
- package/dist/react/utils/useUnresolvedFileInstance.d.ts +1 -0
- package/dist/react/utils/useUnresolvedFileInstance.d.ts.map +1 -1
- package/dist/react/utils/useUnresolvedFileInstance.js +26 -11
- package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -1
- package/dist/renderers/DiffHunksRenderer.d.ts +2 -1
- package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/DiffHunksRenderer.js +62 -32
- package/dist/renderers/DiffHunksRenderer.js.map +1 -1
- package/dist/renderers/FileRenderer.d.ts +4 -1
- package/dist/renderers/FileRenderer.d.ts.map +1 -1
- package/dist/renderers/FileRenderer.js +55 -30
- package/dist/renderers/FileRenderer.js.map +1 -1
- package/dist/renderers/UnresolvedFileHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/UnresolvedFileHunksRenderer.js +1 -1
- package/dist/renderers/UnresolvedFileHunksRenderer.js.map +1 -1
- package/dist/ssr/FileDiffReact.js +1 -1
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/canUseWASM.d.ts +13 -0
- package/dist/utils/canUseWASM.d.ts.map +1 -0
- package/dist/utils/canUseWASM.js +59 -0
- package/dist/utils/canUseWASM.js.map +1 -0
- package/dist/utils/getCodeViewItemRenderData.d.ts +10 -0
- package/dist/utils/getCodeViewItemRenderData.d.ts.map +1 -0
- package/dist/utils/getCodeViewItemRenderData.js +19 -0
- package/dist/utils/getCodeViewItemRenderData.js.map +1 -0
- package/dist/utils/hastToHtml.d.ts +2 -2
- package/dist/utils/hastToHtml.js +2 -2
- package/dist/utils/hastToHtml.js.map +1 -1
- package/dist/utils/hydratePartialDiff.js +4 -0
- package/dist/utils/hydratePartialDiff.js.map +1 -1
- package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -1
- package/dist/utils/parseMergeConflictDiffFromFile.js +2 -0
- package/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -1
- package/dist/utils/parsePatchFiles.d.ts.map +1 -1
- package/dist/utils/parsePatchFiles.js +24 -4
- package/dist/utils/parsePatchFiles.js.map +1 -1
- package/dist/utils/renderTokenLines.d.ts +6 -1
- package/dist/utils/renderTokenLines.d.ts.map +1 -1
- package/dist/utils/renderTokenLines.js +4 -0
- package/dist/utils/renderTokenLines.js.map +1 -1
- package/dist/utils/resolveRegion.js +20 -10
- package/dist/utils/resolveRegion.js.map +1 -1
- package/dist/utils/tokenStyle.d.ts +5 -1
- package/dist/utils/tokenStyle.d.ts.map +1 -1
- package/dist/utils/tokenStyle.js +5 -1
- package/dist/utils/tokenStyle.js.map +1 -1
- package/dist/utils/tokensToHtml.d.ts +5 -2
- package/dist/utils/tokensToHtml.d.ts.map +1 -1
- package/dist/utils/tokensToHtml.js +5 -2
- package/dist/utils/tokensToHtml.js.map +1 -1
- package/dist/utils/updateDiffHunks.d.ts +2 -2
- package/dist/utils/updateDiffHunks.d.ts.map +1 -1
- package/dist/utils/updateDiffHunks.js +7 -3
- package/dist/utils/updateDiffHunks.js.map +1 -1
- package/dist/worker/WorkerPoolManager.d.ts +12 -0
- package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
- package/dist/worker/WorkerPoolManager.js +99 -21
- package/dist/worker/WorkerPoolManager.js.map +1 -1
- package/dist/worker/{highlights-sAHlxqlf.js → highlights-CpZm9DAR.js} +2 -2
- package/dist/worker/{highlights-sAHlxqlf.js.map → highlights-CpZm9DAR.js.map} +1 -1
- package/dist/worker/{shiki-Bx2JpdqZ.js → shiki-Ci4cdHsM.js} +2 -2
- package/dist/worker/{shiki-Bx2JpdqZ.js.map → shiki-Ci4cdHsM.js.map} +1 -1
- package/dist/worker/{stream-tokenizer-YZ6M1qSx.js → stream-tokenizer-DK9xp5M5.js} +8 -5
- package/dist/worker/stream-tokenizer-DK9xp5M5.js.map +1 -0
- package/dist/worker/types.d.ts +11 -0
- package/dist/worker/types.d.ts.map +1 -1
- package/dist/worker/worker-portable.js +4 -4
- package/dist/worker/worker-portable.js.map +1 -1
- package/dist/worker/worker.js +12 -3
- package/dist/worker/worker.js.map +1 -1
- package/package.json +28 -30
- package/dist/worker/stream-tokenizer-YZ6M1qSx.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shiki-Bx2JpdqZ.js","names":[],"sources":["../../src/highlighter/languages/resolveLanguage.ts","../../src/highlighter/languages/getResolvedOrResolveLanguage.ts","../../src/highlighter/languages/resolveLanguages.ts","../../src/editor/utils.ts","../../src/highlighter/shiki-editor.ts","../../src/highlighter/shiki-stream.ts","../../src/highlighter/backends/shiki.ts"],"sourcesContent":["import type { BundledLanguage } from 'shiki';\n\nimport type { SupportedLanguages } from '../../types';\nimport { isWorkerContext } from '../../utils/isWorkerContext';\nimport type { ResolvedLanguage } from '../../worker';\nimport {\n RegisteredCustomLanguages,\n ResolvedLanguages,\n ResolvingLanguages,\n} from './constants';\n\ndeclare const __DIFFS_WORKER__: boolean | undefined;\n\nexport async function resolveLanguage(\n lang: Exclude<SupportedLanguages, 'text' | 'ansi'>\n): Promise<ResolvedLanguage> {\n if (\n typeof __DIFFS_WORKER__ !== 'undefined'\n ? __DIFFS_WORKER__\n : isWorkerContext()\n ) {\n throw new Error(\n `resolveLanguage(\"${lang}\") cannot be called from a worker context. Languages must be pre-resolved on the main thread and passed to the worker via the resolvedLanguages parameter.`\n );\n }\n const pending = ResolvingLanguages.get(lang);\n if (pending != null) return pending;\n const resolver = (async () => {\n let loader = RegisteredCustomLanguages.get(lang);\n if (loader == null) {\n const { bundledLanguages } = await import('shiki/langs');\n if (Object.prototype.hasOwnProperty.call(bundledLanguages, lang))\n loader = bundledLanguages[lang as BundledLanguage];\n }\n if (loader == null)\n throw new Error(\n `resolveLanguage: \"${lang}\" not found in bundled or custom languages`\n );\n const { default: data } = await loader();\n const resolvedLang = { name: lang, data };\n if (!ResolvedLanguages.has(lang)) ResolvedLanguages.set(lang, resolvedLang);\n return resolvedLang;\n })();\n ResolvingLanguages.set(lang, resolver);\n try {\n return await resolver;\n } finally {\n if (ResolvingLanguages.get(lang) === resolver)\n ResolvingLanguages.delete(lang);\n }\n}\n","import type { SupportedLanguages } from '../../types';\nimport type { ResolvedLanguage } from '../../worker';\nimport { ResolvedLanguages } from './constants';\nimport { resolveLanguage } from './resolveLanguage';\n\nexport function getResolvedOrResolveLanguage(\n language: Exclude<SupportedLanguages, 'text' | 'ansi'>\n): ResolvedLanguage | Promise<ResolvedLanguage> {\n return ResolvedLanguages.get(language) ?? resolveLanguage(language);\n}\n","import type { SupportedLanguages } from '../../types';\nimport type { ResolvedLanguage } from '../../worker';\nimport { getResolvedOrResolveLanguage } from './getResolvedOrResolveLanguage';\nimport { resolveLanguage } from './resolveLanguage';\n\nexport async function resolveLanguages(\n languages: SupportedLanguages[]\n): Promise<ResolvedLanguage[]> {\n const resolvedLanguages: ResolvedLanguage[] = [];\n const languagesToResolve: Promise<ResolvedLanguage | undefined>[] = [];\n for (const language of languages) {\n if (language === 'text' || language === 'ansi') continue;\n const maybeResolvedLanguage =\n getResolvedOrResolveLanguage(language) ?? resolveLanguage(language);\n if ('then' in maybeResolvedLanguage) {\n languagesToResolve.push(maybeResolvedLanguage);\n } else {\n resolvedLanguages.push(maybeResolvedLanguage);\n }\n }\n if (languagesToResolve.length > 0) {\n await Promise.all(languagesToResolve).then((_resolvedLanguages) => {\n for (const resolvedLanguage of _resolvedLanguages) {\n if (resolvedLanguage == null) {\n throw new Error('resolvedLanguages: unable to resolve language');\n }\n resolvedLanguages.push(resolvedLanguage);\n }\n });\n }\n\n return resolvedLanguages;\n}\n","export function h<K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n props?: {\n style?: string | Partial<CSSStyleDeclaration>;\n dataset?: DOMStringMap | string[] | string;\n children?: (Node | string)[];\n } & Partial<Omit<HTMLElementTagNameMap[K], 'style' | 'dataset' | 'children'>>,\n parent?: Element | ShadowRoot | DocumentFragment\n): HTMLElementTagNameMap[K] {\n const { style, dataset, children, ...attrs } = props ?? {};\n const el = document.createElement(tagName);\n Object.assign(el, attrs);\n if (style !== undefined) {\n if (typeof style === 'string') {\n el.style.cssText = style;\n } else {\n Object.assign(el.style, style);\n }\n }\n if (dataset !== undefined) {\n if (typeof dataset === 'string') {\n el.dataset[dataset] = '';\n } else if (Array.isArray(dataset)) {\n dataset.forEach((key) => {\n el.dataset[key] = '';\n });\n } else {\n Object.assign(el.dataset, dataset);\n }\n }\n if (children !== undefined) {\n el.replaceChildren(...children);\n }\n if (parent !== undefined) {\n parent.appendChild(el);\n }\n return el;\n}\n\nexport function isPromise<T>(value: T | Promise<T>): value is Promise<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function'\n );\n}\n\nexport function addEventListener<K extends keyof HTMLElementEventMap>(\n el: HTMLElement,\n event: K,\n listener: (this: HTMLElement, evt: HTMLElementEventMap[K]) => void,\n options?: AddEventListenerOptions\n): () => void;\nexport function addEventListener<K extends keyof DocumentEventMap>(\n el: Document,\n event: K,\n listener: (this: Document, evt: DocumentEventMap[K]) => void,\n options?: AddEventListenerOptions\n): () => void;\nexport function addEventListener<K extends keyof WindowEventMap>(\n el: Window,\n event: K,\n listener: (this: Window, evt: WindowEventMap[K]) => void,\n options?: AddEventListenerOptions\n): () => void;\nexport function addEventListener<K extends keyof MediaQueryListEventMap>(\n el: MediaQueryList,\n event: K,\n listener: (this: MediaQueryList, evt: MediaQueryListEventMap[K]) => void,\n options?: AddEventListenerOptions\n): () => void;\nexport function addEventListener(\n el: HTMLElement | Document | ShadowRoot | Window | MediaQueryList,\n event: string,\n listener: EventListener,\n options?: AddEventListenerOptions\n) {\n el.addEventListener(event, listener, options);\n return () => el.removeEventListener(event, listener, options);\n}\n\nexport function getLineNumberAttr(\n el: HTMLElement,\n key = 'line'\n): number | undefined {\n const value = el.dataset[key];\n if (value === undefined) {\n return undefined;\n }\n const lineNumber = parseInt(value, 10);\n if (Number.isNaN(lineNumber)) {\n return undefined;\n }\n return lineNumber;\n}\n\nexport function clampDomOffset(node: Node, offset: number): number {\n if (node.nodeType === 3) {\n const length = (node as Text).textContent?.length ?? 0;\n return Math.max(0, Math.min(offset, length));\n }\n if (node.nodeType === 1) {\n return Math.max(0, Math.min(offset, node.childNodes.length));\n }\n return 0;\n}\n\nexport function extend<T extends object>(obj: T, attrs: Partial<T>): T {\n return Object.assign(obj, attrs);\n}\n\n// oxlint-disable-next-line typescript/no-explicit-any\nexport function debounce<T extends (...args: any[]) => void>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: ReturnType<typeof setTimeout>;\n return function (this: ThisType<T>, ...args: Parameters<T>) {\n clearTimeout(timeout);\n timeout = setTimeout(() => func.apply(this, args), wait);\n };\n}\n\nexport function round(value: number, precision: number = 1000): number {\n return Math.round(value * precision) / precision;\n}\n\nexport function endsWithLineBreak(text: string): boolean {\n return text.endsWith('\\n') || text.endsWith('\\r');\n}\n\n// Creates an Intl.Segmenter, or undefined when the engine lacks support.\n// Callers must fall back to a degraded path when this returns undefined.\nexport function createSegmenter(\n options: Intl.SegmenterOptions\n): Intl.Segmenter | undefined {\n if (typeof Intl === 'undefined' || typeof Intl.Segmenter !== 'function') {\n return undefined;\n }\n return new Intl.Segmenter(undefined, options);\n}\n\n// Lazily created and cached grapheme segmenter. Avoids constructing\n// Intl.Segmenter at import time so importing the editor never throws on\n// engines that lack it. Undefined when the engine has no Intl.Segmenter.\nlet graphemeSegmenter: Intl.Segmenter | undefined;\nlet graphemeSegmenterInit = false;\nexport function getGraphemeSegmenter(): Intl.Segmenter | undefined {\n if (!graphemeSegmenterInit) {\n graphemeSegmenter = createSegmenter({ granularity: 'grapheme' });\n graphemeSegmenterInit = true;\n }\n return graphemeSegmenter;\n}\n\n// lookup the scroll container for the given element\nexport function lookupScrollContainer(\n element: HTMLElement\n): HTMLElement | Document {\n const ownerDocument = element.ownerDocument;\n let parentElement = element.parentElement;\n while (\n parentElement != null &&\n parentElement !== ownerDocument.body &&\n parentElement !== ownerDocument.documentElement\n ) {\n const overflowY =\n parentElement.ownerDocument.defaultView?.getComputedStyle(\n parentElement\n ).overflowY;\n if (\n overflowY === 'auto' ||\n overflowY === 'scroll' ||\n overflowY === 'overlay'\n ) {\n return parentElement;\n }\n parentElement = parentElement.parentElement;\n }\n return ownerDocument;\n}\n","import type { HighlighterCore } from 'shiki/core';\nimport {\n EncodedTokenMetadata,\n type IGrammar,\n INITIAL,\n type StateStack,\n} from 'shiki/textmate';\n\nimport type { TextDocumentChange } from '../editor/textDocument';\nimport { debounce } from '../editor/utils';\nimport type { HighlightedToken, RenderRange } from '../types';\nimport type { DiffsEditorTokenizer } from './DiffsEditorTokenizer';\nimport type { DiffsEditorTokenizerOptions } from './tokenizer-types';\nimport type { DiffsHighlighter } from './types';\n\n// Timed aborts can leave incomplete grammar state; limit line length instead.\nconst TOKENIZE_TIME_LIMIT = 0;\nlet nextTokenizerId = 0;\n\n/** TextMate state caching and background work for a single editable document. */\nexport class ShikiEditorTokenizer implements DiffsEditorTokenizer {\n #highlighter: HighlighterCore;\n #grammar: IGrammar | undefined;\n #themeName: string;\n #colorMap: string[];\n #textDocument: DiffsEditorTokenizerOptions['textDocument'];\n #tokenizeMaxLineLength: number;\n #onDeferTokenize: DiffsEditorTokenizerOptions['onDeferTokenize'];\n #matchBrackets: boolean;\n #debug: boolean;\n #isCleanedUp = false;\n #stateStack: StateStack[] = [INITIAL]; // cached state stack by line index\n #comparisonStateStack: StateStack[] = [];\n #comparisonStateStackStart = 0;\n #comparisonLineChanges: NonNullable<\n TextDocumentChange['changedLineChanges']\n > = [];\n #lastLine: number = -1;\n #isStopped: boolean = true;\n #isPaused: boolean = false;\n #backgroundJobId: number = 0;\n #tokenizerId = ++nextTokenizerId;\n #backgroundPrebuildEndLine = -1;\n #pendingPrebuildEndLine = -1;\n #backgroundChangedLineRanges: readonly [number, number][] | undefined;\n #backgroundChangedRangeIndex: number = 0;\n #bracketIgnoredRanges: ([number, number][] | null | undefined)[] = [];\n #isMessageListenerAttached: boolean = false;\n\n #prebuildStateStack = debounce(async (renderRange?: RenderRange) => {\n // A queued timer may run after the highlighter is disposed.\n if (this.#isCleanedUp) {\n return;\n }\n const { startingLine = 0, totalLines = Infinity } = renderRange ?? {};\n const endLine = Math.min(\n totalLines === Infinity ? Infinity : startingLine + totalLines,\n this.#textDocument.lineCount\n );\n if (\n this.#grammar == null &&\n !isGrammarlessLanguage(this.#textDocument.languageId)\n ) {\n await this.backend?.loadLanguages([this.#textDocument.languageId]);\n if (this.#isCleanedUp) {\n return;\n }\n this.#grammar = this.#highlighter.getLanguage(\n this.#textDocument.languageId\n );\n }\n this.#ensureActiveTheme();\n this.#scheduleStatePrebuild(endLine);\n }, 500);\n\n #onMessage = ({ data }: MessageEvent<unknown>) => {\n if (typeof data !== 'object' || data === null) {\n return;\n }\n const { type, tokenizerId, jobId } = data as {\n type?: unknown;\n tokenizerId?: unknown;\n jobId?: unknown;\n };\n if (\n type === 'tokenize' &&\n tokenizerId === this.#tokenizerId &&\n typeof jobId === 'number' &&\n jobId === this.#backgroundJobId\n ) {\n if (this.#backgroundPrebuildEndLine >= 0) {\n this.#backgroundPrebuild(jobId);\n } else {\n this.#backgroundTokenize(jobId);\n }\n }\n };\n\n getStringCommentRegexpRangesInLine(\n lineIndex: number\n ): [number, number][] | null {\n if (\n !this.#matchBrackets ||\n lineIndex < 0 ||\n lineIndex >= this.#textDocument.lineCount\n ) {\n return null;\n }\n this.#ensureGrammar();\n if (this.#grammar == null) {\n return null;\n }\n if (this.#bracketIgnoredRanges[lineIndex] === undefined) {\n this.#buildStateStack(lineIndex);\n const state = this.#stateStack[lineIndex] ?? INITIAL;\n const result = this.#tokenizeLineAt(lineIndex, state);\n this.#stateStack[lineIndex + 1] = result.state;\n }\n return this.#bracketIgnoredRanges[lineIndex] ?? null;\n }\n\n constructor(\n highlighter: HighlighterCore,\n options: DiffsEditorTokenizerOptions,\n private readonly backend?: Pick<\n DiffsHighlighter,\n 'getTheme' | 'loadLanguages'\n >\n ) {\n this.#highlighter = highlighter;\n this.#textDocument = options.textDocument;\n this.#themeName = options.theme;\n this.#colorMap = [];\n // The cutoff must match codeToTokens and Highlights: length >= limit.\n this.#tokenizeMaxLineLength = options.tokenizeMaxLineLength ?? 1000;\n this.#onDeferTokenize = options.onDeferTokenize;\n this.#matchBrackets = options.matchBrackets !== false;\n this.#debug = options.__debug ?? false;\n this.#ensureGrammar();\n this.#ensureActiveTheme();\n }\n\n setTheme(themeName: string): void {\n if (this.#themeName === themeName) return;\n this.#themeName = themeName;\n this.#ensureActiveTheme();\n this.stopBackgroundTokenize();\n this.#stateStack = [INITIAL];\n this.#comparisonStateStack = [];\n this.#comparisonStateStackStart = 0;\n this.#comparisonLineChanges = [];\n if (this.#grammar != null && this.#textDocument.lineCount > 0) {\n this.#scheduleBackgroundTokenize(0);\n }\n }\n\n // Dual-theme SSR can change the shared highlighter's active theme. Restore\n // the editor theme before tokenizing so color indices match its color map.\n #ensureActiveTheme(): void {\n if (this.#themeName === '') {\n return;\n }\n // Resolving a theme does not attach it to Shiki until the backend uses it.\n this.backend?.getTheme(this.#themeName);\n const { colorMap } = this.#highlighter.setTheme(this.#themeName);\n this.#colorMap = colorMap;\n }\n\n dispose(): void {\n this.#isCleanedUp = true;\n this.stopBackgroundTokenize();\n this.#detachMessageListener();\n }\n\n // Prebuild viewport state with prebuildStateStack before the first edit.\n tokenize(\n change: TextDocumentChange,\n renderRange?: RenderRange,\n hostRealignsRows = false\n ): Map<number, Array<HighlightedToken>> {\n this.#ensureGrammar();\n this.#ensureActiveTheme();\n if (\n this.#grammar == null &&\n !isGrammarlessLanguage(this.#textDocument.languageId)\n ) {\n throw new Error(\n `Grammar for language \"${this.#textDocument.languageId}\" not loaded`\n );\n }\n\n const { lineCount } = this.#textDocument;\n const { startingLine = 0, totalLines = Infinity } = renderRange ?? {};\n const renderRangeEndLine =\n totalLines === Infinity\n ? lineCount\n : Math.min(startingLine + totalLines, lineCount);\n\n const dirtyStart = change.startLine;\n const viewStart = Math.max(startingLine, dirtyStart);\n const crossesRenderRangeEnd =\n renderRange != null &&\n totalLines !== Infinity &&\n change.lineDelta > 0 &&\n dirtyStart < renderRangeEndLine &&\n change.endLine >= renderRangeEndLine;\n const canReuseCachedStates =\n change.lineDelta === 0 &&\n (change.changedLineChanges?.every(([, , lineDelta]) => lineDelta === 0) ??\n true);\n if (this.#matchBrackets && !canReuseCachedStates) {\n // Structural edits shift line indexes; only the unchanged prefix is valid.\n this.#bracketIgnoredRanges.length = Math.min(\n this.#bracketIgnoredRanges.length,\n change.startLine\n );\n }\n const canReuseShiftedStates =\n hostRealignsRows && change.lineDelta !== 0 && dirtyStart >= startingLine;\n const canCacheTokenizedStates =\n canReuseCachedStates || renderRange == null || dirtyStart >= viewStart;\n const changedLineRanges: readonly [number, number][] =\n change.changedLineRanges ?? [[dirtyStart, change.endLine]];\n this.#comparisonStateStack = [];\n this.#comparisonStateStackStart = 0;\n this.#comparisonLineChanges = [];\n let offscreenSyncEnd = -1;\n if (dirtyStart < viewStart) {\n for (const [rangeStart, rangeEnd] of changedLineRanges) {\n if (rangeStart < viewStart) {\n offscreenSyncEnd = Math.max(\n offscreenSyncEnd,\n Math.min(rangeEnd, viewStart - 1)\n );\n }\n }\n }\n const shouldFlushOffscreenLines =\n offscreenSyncEnd >= dirtyStart &&\n (canReuseCachedStates || change.lineDelta < 0);\n if (canReuseCachedStates) {\n this.#buildStateStack(dirtyStart);\n } else {\n this.#shiftComparisonStateStack(change);\n if (renderRange == null || dirtyStart >= viewStart) {\n this.#buildStateStack(viewStart);\n }\n }\n\n let changedRangeIndex = 0;\n let currentChangedRangeEnd = changedLineRanges[changedRangeIndex][1];\n let backgroundStartLine: number | undefined;\n let backgroundChangedRangeIndex = 0;\n let line = canReuseCachedStates\n ? changedLineRanges[changedRangeIndex][0]\n : viewStart;\n let settled = false;\n const dirtyLines: Map<number, Array<HighlightedToken>> = new Map();\n const offscreenDirtyLines:\n | Map<number, Array<HighlightedToken>>\n | undefined = shouldFlushOffscreenLines ? new Map() : undefined;\n if (offscreenDirtyLines != null && !canReuseCachedStates) {\n const offscreenEnd = Math.min(\n offscreenSyncEnd + 1,\n viewStart,\n renderRangeEndLine\n );\n if (offscreenEnd > dirtyStart) {\n this.#buildStateStack(offscreenEnd);\n let offscreenLine = dirtyStart;\n let offscreenState = this.#stateStack[offscreenLine] ?? INITIAL;\n for (; offscreenLine < offscreenEnd; offscreenLine++) {\n const resolved = this.#tokenizeLineAt(offscreenLine, offscreenState);\n offscreenState = resolved.state;\n offscreenDirtyLines.set(offscreenLine, resolved.resolvedTokens);\n }\n this.#stateStack[offscreenEnd] = offscreenState;\n }\n }\n // Read state after the offscreen flush; a deletion may have invalidated\n // the viewport's starting state inside a block comment or template literal.\n let state = this.#stateStack[line] ?? INITIAL;\n for (; line < renderRangeEndLine; ) {\n const previousNextState = canReuseCachedStates\n ? this.#stateStack[line + 1]\n : canReuseShiftedStates\n ? this.#getPreviousEndState(line + 1)\n : undefined;\n if (canCacheTokenizedStates) {\n this.#stateStack[line] = state;\n }\n\n const { resolvedTokens, state: nextState } = this.#tokenizeLineAt(\n line,\n state\n );\n state = nextState;\n\n if (line >= viewStart) {\n dirtyLines.set(line, resolvedTokens);\n } else {\n offscreenDirtyLines?.set(line, resolvedTokens);\n }\n\n if (canCacheTokenizedStates) {\n this.#stateStack[line + 1] = state;\n }\n settled =\n line >= currentChangedRangeEnd &&\n (canReuseCachedStates || canReuseShiftedStates) &&\n previousNextState != null &&\n state.equals(previousNextState);\n if (settled) {\n changedRangeIndex++;\n const nextRange = changedLineRanges[changedRangeIndex];\n if (nextRange == null) {\n break;\n }\n if (nextRange[0] >= renderRangeEndLine) {\n backgroundStartLine = nextRange[0];\n backgroundChangedRangeIndex = changedRangeIndex;\n break;\n }\n let nextState: StateStack | undefined = this.#stateStack[nextRange[0]];\n if (canReuseShiftedStates) {\n for (\n let stateLine = line + 2;\n stateLine <= nextRange[0];\n stateLine++\n ) {\n nextState = this.#getPreviousEndState(stateLine);\n if (nextState == null) {\n break;\n }\n this.#stateStack[stateLine] = nextState;\n }\n }\n if (nextState == null) {\n currentChangedRangeEnd = nextRange[1];\n line++;\n } else {\n line = nextRange[0];\n state = nextState;\n currentChangedRangeEnd = nextRange[1];\n }\n settled = false;\n continue;\n }\n line++;\n }\n\n if (canCacheTokenizedStates) {\n if (line < renderRangeEndLine) {\n this.#stateStack[line + 1] = state;\n } else {\n this.#stateStack[line] = state;\n }\n }\n\n if (settled && canReuseShiftedStates && backgroundStartLine == null) {\n for (let stateLine = line + 2; stateLine <= lineCount; stateLine++) {\n const previousState = this.#getPreviousEndState(stateLine);\n if (previousState == null) {\n break;\n }\n this.#stateStack[stateLine] = previousState;\n }\n this.#comparisonStateStack = [];\n this.#comparisonStateStackStart = 0;\n this.#comparisonLineChanges = [];\n }\n\n if (offscreenDirtyLines != null && offscreenDirtyLines.size > 0) {\n this.#onDeferTokenize(offscreenDirtyLines);\n }\n\n if (backgroundStartLine != null) {\n if (this.#matchBrackets && canReuseCachedStates) {\n this.#bracketIgnoredRanges.length = Math.min(\n this.#bracketIgnoredRanges.length,\n backgroundStartLine\n );\n }\n this.#scheduleBackgroundTokenize(\n backgroundStartLine,\n changedLineRanges,\n backgroundChangedRangeIndex\n );\n } else if (!settled && line < lineCount) {\n const backgroundLine =\n crossesRenderRangeEnd && dirtyStart >= viewStart\n ? renderRangeEndLine\n : dirtyStart < viewStart && !canReuseCachedStates\n ? dirtyStart\n : line;\n if (this.#matchBrackets && canReuseCachedStates) {\n this.#bracketIgnoredRanges.length = Math.min(\n this.#bracketIgnoredRanges.length,\n backgroundLine\n );\n }\n this.#scheduleBackgroundTokenize(\n backgroundLine,\n changedLineRanges,\n changedRangeIndex\n );\n }\n\n return dirtyLines;\n }\n\n prebuildStateStack(renderRange?: RenderRange): void {\n this.#ensureGrammar();\n this.#prebuildStateStack(renderRange);\n }\n\n stopBackgroundTokenize(): void {\n this.#pendingPrebuildEndLine = -1;\n if (this.#isStopped) {\n return;\n }\n this.#isStopped = true;\n this.#isPaused = false;\n this.#lastLine = -1;\n this.#backgroundPrebuildEndLine = -1;\n this.#backgroundChangedLineRanges = undefined;\n this.#backgroundChangedRangeIndex = 0;\n this.#comparisonStateStack = [];\n this.#comparisonStateStackStart = 0;\n this.#comparisonLineChanges = [];\n this.#detachMessageListener();\n }\n\n pauseBackgroundTokenize(): void {\n if (this.#isStopped || this.#isPaused) {\n return;\n }\n if (this.#debug) {\n console.log('[diffs/editor] background tokenization paused', {\n jobId: this.#backgroundJobId,\n });\n }\n this.#isPaused = true;\n }\n\n resumeBackgroundTokenize(): void {\n if (\n this.#isStopped ||\n !this.#isPaused ||\n this.#grammar == null ||\n this.#lastLine < 0\n ) {\n return;\n }\n if (this.#debug) {\n console.log('[diffs/editor] background tokenization resumed', {\n jobId: this.#backgroundJobId,\n });\n }\n this.#isPaused = false;\n this.#postTokenizeMessage(this.#backgroundJobId);\n }\n\n #ensureGrammar(): void {\n if (\n this.#grammar == null &&\n !isGrammarlessLanguage(this.#textDocument.languageId) &&\n this.#highlighter\n .getLoadedLanguages()\n .includes(this.#textDocument.languageId)\n ) {\n this.#grammar = this.#highlighter.getLanguage(\n this.#textDocument.languageId\n );\n }\n }\n\n #attachMessageListener(): void {\n if (this.#isMessageListenerAttached) {\n return;\n }\n globalThis.addEventListener('message', this.#onMessage);\n this.#isMessageListenerAttached = true;\n }\n\n #detachMessageListener(): void {\n if (!this.#isMessageListenerAttached) {\n return;\n }\n globalThis.removeEventListener('message', this.#onMessage);\n this.#isMessageListenerAttached = false;\n }\n\n #postTokenizeMessage(jobId: number): void {\n // use `postMessage` instead of `setTimeout(fn, 0)` to avoid 4ms delay\n globalThis.postMessage({\n type: 'tokenize',\n tokenizerId: this.#tokenizerId,\n jobId,\n });\n }\n\n #scheduleBackgroundTokenize(\n startLine: number,\n changedLineRanges?: readonly [number, number][],\n changedRangeIndex = 0\n ): void {\n if (isGrammarlessLanguage(this.#textDocument.languageId)) {\n return;\n }\n\n const jobId = ++this.#backgroundJobId;\n\n if (this.#debug) {\n console.log('[diffs/editor] background tokenization scheduled', {\n jobId,\n startLine,\n changedLineRanges,\n changedRangeIndex,\n });\n }\n\n this.#isStopped = false;\n this.#isPaused = false;\n this.#lastLine = startLine;\n if (this.#backgroundPrebuildEndLine >= 0) {\n this.#pendingPrebuildEndLine = Math.max(\n this.#pendingPrebuildEndLine,\n this.#backgroundPrebuildEndLine\n );\n }\n this.#backgroundPrebuildEndLine = -1;\n this.#backgroundChangedLineRanges = changedLineRanges;\n this.#backgroundChangedRangeIndex = changedRangeIndex;\n this.#attachMessageListener();\n this.#postTokenizeMessage(jobId);\n }\n\n #scheduleStatePrebuild(endLine: number): void {\n if (this.#grammar == null || this.#stateStack.length > endLine) {\n return;\n }\n // Extend an active prebuild, or retain the target until the foreground\n // edit job reconverges and releases the state cache.\n if (!this.#isStopped) {\n if (this.#backgroundPrebuildEndLine >= 0) {\n this.#backgroundPrebuildEndLine = Math.max(\n this.#backgroundPrebuildEndLine,\n endLine\n );\n } else {\n this.#pendingPrebuildEndLine = Math.max(\n this.#pendingPrebuildEndLine,\n endLine\n );\n }\n return;\n }\n\n const jobId = ++this.#backgroundJobId;\n this.#isStopped = false;\n this.#isPaused = false;\n this.#lastLine = this.#stateStack.length - 1;\n this.#backgroundPrebuildEndLine = endLine;\n this.#pendingPrebuildEndLine = -1;\n this.#backgroundChangedLineRanges = undefined;\n this.#backgroundChangedRangeIndex = 0;\n this.#attachMessageListener();\n this.#postTokenizeMessage(jobId);\n }\n\n #tokenizeLineAt(\n line: number,\n state: StateStack\n ): { resolvedTokens: Array<HighlightedToken>; state: StateStack } {\n const lineText = this.#textDocument.getLineText(line);\n if (lineText.length >= this.#tokenizeMaxLineLength) {\n console.warn(\n `[diffs] Line(${line}) too long to tokenize: ${lineText.length}`\n );\n this.#cacheBracketIgnoredRanges(line, null);\n return { resolvedTokens: [[0, '', lineText]], state };\n }\n if (this.#grammar == null || lineText === '' || lineText.trim() === '') {\n this.#cacheBracketIgnoredRanges(line, null);\n return { resolvedTokens: [[0, '', lineText]], state };\n }\n const result = tokenizeLine(\n this.#grammar,\n this.#colorMap,\n lineText,\n state,\n TOKENIZE_TIME_LIMIT,\n this.#matchBrackets\n );\n this.#cacheBracketIgnoredRanges(line, result.bracketIgnoredRanges);\n return {\n resolvedTokens: result.resolvedTokens,\n state: result.ruleStack,\n };\n }\n\n #cacheBracketIgnoredRanges(\n line: number,\n ranges: [number, number][] | null\n ): void {\n if (this.#matchBrackets) {\n this.#bracketIgnoredRanges[line] = ranges;\n }\n }\n\n // Preserve old end states as comparison-only sentinels, copying whichever\n // side of the edit is smaller. Index shifts are resolved lazily on lookup.\n #shiftComparisonStateStack(change: TextDocumentChange): void {\n const lineChanges =\n change.changedLineChanges ??\n ([[change.startLine, change.endLine, change.lineDelta]] as const);\n const comparisonStart = change.startLine + 1;\n const comparisonLength = this.#stateStack.length - comparisonStart;\n if (comparisonStart <= comparisonLength) {\n this.#comparisonStateStack = this.#stateStack;\n this.#comparisonStateStackStart = 0;\n this.#stateStack = this.#stateStack.slice(0, comparisonStart);\n } else {\n this.#comparisonStateStackStart = comparisonStart;\n this.#comparisonStateStack = this.#stateStack.slice(comparisonStart);\n this.#stateStack.length = Math.min(\n this.#stateStack.length,\n comparisonStart\n );\n }\n this.#comparisonLineChanges = lineChanges;\n }\n\n #getPreviousEndState(line: number): StateStack | undefined {\n let previousLine = line;\n for (\n let index = this.#comparisonLineChanges.length - 1;\n index >= 0;\n index--\n ) {\n const [startLine, endLine, lineDelta] =\n this.#comparisonLineChanges[index];\n if (lineDelta === 0) {\n continue;\n }\n if (previousLine > endLine) {\n previousLine -= lineDelta;\n } else if (previousLine > startLine) {\n return this.#stateStack[line];\n }\n }\n return (\n this.#comparisonStateStack[\n previousLine - this.#comparisonStateStackStart\n ] ?? this.#stateStack[line]\n );\n }\n\n #buildStateStack(endAt: number, timeBudget?: number): boolean {\n const boundedEndAt = Math.min(\n Math.max(0, endAt),\n this.#textDocument.lineCount\n );\n if (this.#stateStack.length > boundedEndAt || this.#grammar == null) {\n return true;\n }\n const startedAt = timeBudget == null ? 0 : performance.now();\n let line = this.#stateStack.length - 1;\n let state = this.#stateStack[line] ?? INITIAL;\n while (line < boundedEndAt) {\n this.#stateStack[line] = state;\n const lineText = this.#textDocument.getLineText(line);\n if (\n lineText.length < this.#tokenizeMaxLineLength &&\n lineText !== '' &&\n lineText.trim() !== ''\n ) {\n const result = tokenizeLine(\n this.#grammar,\n this.#colorMap,\n lineText,\n state,\n TOKENIZE_TIME_LIMIT,\n this.#matchBrackets,\n false\n );\n this.#cacheBracketIgnoredRanges(line, result.bracketIgnoredRanges);\n state = result.ruleStack;\n } else {\n this.#cacheBracketIgnoredRanges(line, null);\n }\n line++;\n this.#stateStack[line] = state;\n if (timeBudget != null && performance.now() - startedAt > timeBudget) {\n break;\n }\n }\n return line >= boundedEndAt;\n }\n\n #backgroundPrebuild(jobId: number): void {\n if (\n this.#isStopped ||\n this.#isPaused ||\n this.#grammar == null ||\n jobId !== this.#backgroundJobId\n ) {\n return;\n }\n\n this.#ensureActiveTheme();\n // State prebuilds intentionally omit rendered tokens and yield between\n // short chunks so a deep viewport does not monopolize the main thread.\n const complete = this.#buildStateStack(this.#backgroundPrebuildEndLine, 1);\n if (this.#isStopped || this.#isPaused || jobId !== this.#backgroundJobId) {\n return;\n }\n if (complete) {\n this.stopBackgroundTokenize();\n return;\n }\n this.#lastLine = this.#stateStack.length - 1;\n this.#postTokenizeMessage(jobId);\n }\n\n #backgroundTokenize(jobId: number) {\n if (\n this.#isStopped ||\n this.#isPaused ||\n this.#grammar == null ||\n jobId !== this.#backgroundJobId\n ) {\n return;\n }\n\n this.#ensureActiveTheme();\n\n const t = performance.now();\n const lines = new Map<number, Array<HighlightedToken>>();\n const totalLines = this.#textDocument.lineCount;\n const changedLineRanges = this.#backgroundChangedLineRanges;\n\n let line = this.#lastLine;\n let state = this.#stateStack[line] ?? INITIAL;\n let settled = false;\n let changedRangeIndex = this.#backgroundChangedRangeIndex;\n let currentChangedRangeEnd = changedLineRanges?.[changedRangeIndex]?.[1];\n for (; line < totalLines; ) {\n this.#stateStack[line] = state;\n\n const previousNextState =\n currentChangedRangeEnd != null\n ? this.#getPreviousEndState(line + 1)\n : undefined;\n const result = this.#tokenizeLineAt(line, state);\n lines.set(line, result.resolvedTokens);\n state = result.state;\n\n this.#stateStack[line + 1] = state;\n settled =\n currentChangedRangeEnd != null &&\n line >= currentChangedRangeEnd &&\n previousNextState != null &&\n state.equals(previousNextState);\n line++;\n if (settled) {\n changedRangeIndex++;\n const nextRange = changedLineRanges?.[changedRangeIndex];\n if (nextRange == null) {\n break;\n }\n currentChangedRangeEnd = nextRange[1];\n if (this.#stateStack[nextRange[0]] == null) {\n settled = false;\n } else {\n line = nextRange[0];\n state = this.#stateStack[line] ?? state;\n settled = false;\n continue;\n }\n }\n\n // limit the time of partial tokenize to 1ms\n if (performance.now() - t > 1) {\n break;\n }\n }\n\n this.#onDeferTokenize(lines);\n if (this.#isStopped || this.#isPaused || jobId !== this.#backgroundJobId) {\n return;\n }\n\n if (settled || line >= totalLines) {\n const pendingPrebuildEndLine = this.#pendingPrebuildEndLine;\n this.stopBackgroundTokenize();\n if (pendingPrebuildEndLine >= 0) {\n this.#scheduleStatePrebuild(pendingPrebuildEndLine);\n }\n return;\n }\n\n this.#lastLine = line;\n this.#backgroundChangedRangeIndex = changedRangeIndex;\n this.#postTokenizeMessage(jobId);\n }\n}\n\nfunction tokenizeLine(\n grammar: IGrammar,\n colorMap: string[],\n lineText: string,\n stateStack: StateStack,\n timeLimit?: number,\n collectBracketIgnoredRanges = true,\n resolveTokens = true\n): {\n ruleStack: StateStack;\n resolvedTokens: Array<HighlightedToken>;\n bracketIgnoredRanges: [number, number][];\n} {\n const result = grammar.tokenizeLine2(lineText, stateStack, timeLimit);\n if (result.stoppedEarly) {\n console.warn(\n `[diffs] Time limit reached when tokenizing line: ${lineText.substring(0, 100)}`\n );\n }\n const rawTokens = result.tokens;\n const tokensLength = rawTokens.length / 2;\n const resolvedTokens: Array<HighlightedToken> = [];\n const bracketIgnoredRanges: [number, number][] = [];\n if (!resolveTokens && !collectBracketIgnoredRanges) {\n return {\n ruleStack: result.ruleStack,\n resolvedTokens,\n bracketIgnoredRanges,\n };\n }\n for (let j = 0; j < tokensLength; j++) {\n const offset = rawTokens[2 * j];\n const nextOffset =\n j + 1 < tokensLength ? rawTokens[2 * j + 2] : lineText.length;\n if (offset === nextOffset) {\n // should never reach here, skip if happens anyway\n continue;\n }\n const metadata = rawTokens[2 * j + 1];\n if (resolveTokens) {\n const fg = EncodedTokenMetadata.getForeground(metadata);\n resolvedTokens.push([\n offset,\n colorMap[fg],\n lineText.slice(offset, nextOffset),\n ]);\n }\n if (\n collectBracketIgnoredRanges &&\n EncodedTokenMetadata.getTokenType(metadata) > 0\n ) {\n bracketIgnoredRanges.push([offset, nextOffset]);\n }\n }\n return {\n ruleStack: result.ruleStack,\n resolvedTokens,\n bracketIgnoredRanges,\n };\n}\n\n// Shiki special-cases `text` and `ansi` in codeToHast but does not expose grammars.\nfunction isGrammarlessLanguage(languageId: string): boolean {\n return languageId === 'text' || languageId === 'ansi';\n}\n","import type {\n CodeToTokensOptions,\n GrammarState,\n HighlighterCore,\n} from 'shiki/core';\n\nimport { appendItems } from '../utils/appendItems';\nimport { BaseStreamTokenizer } from './stream-tokenizer';\nimport type { ThemedToken } from './types';\n\nexport class ShikiStreamTokenizer extends BaseStreamTokenizer {\n // Text of the provisional line; it is tokenized again with each chunk.\n #tail = '';\n #grammarState: GrammarState | undefined;\n\n constructor(\n private readonly highlighter: HighlighterCore,\n private readonly options: CodeToTokensOptions\n ) {\n super();\n }\n\n protected tokenizeChunk(\n chunk: string,\n stable: ThemedToken[]\n ): { unstable: ThemedToken[]; tailLength: number } {\n const chunkLines = (this.#tail + chunk).split(/(\\r\\n|\\r|\\n)/);\n let unstable: ThemedToken[] = [];\n for (let i = 0; i < chunkLines.length; i += 2) {\n const line = chunkLines[i];\n const result = this.highlighter.codeToTokens(line, {\n ...this.options,\n grammarState: this.#grammarState,\n });\n const tokens = result.tokens[0].map((token) => ({\n ...token,\n offset: token.offset + this.stableOffset,\n }));\n if (i + 1 < chunkLines.length) {\n appendItems(stable, tokens);\n this.pushLineBreak(stable, line.length, chunkLines[i + 1]);\n this.#grammarState = result.grammarState;\n } else {\n unstable = tokens;\n this.#tail = line;\n }\n }\n return { unstable, tailLength: this.#tail.length };\n }\n\n clone(): ShikiStreamTokenizer {\n this.assertActive();\n const clone = new ShikiStreamTokenizer(this.highlighter, this.options);\n this.copyStateTo(clone);\n clone.#tail = this.#tail;\n clone.#grammarState = this.#grammarState;\n return clone;\n }\n\n protected resetSource(): void {\n this.#tail = '';\n this.#grammarState = undefined;\n }\n\n protected releaseSource(): void {\n this.resetSource();\n }\n}\n","import {\n createCssVariablesTheme,\n createHighlighterCore,\n type HighlighterCore,\n type CodeToTokensOptions as ShikiCodeToTokensOptions,\n} from 'shiki/core';\n\nimport type { ResolvedLanguage } from '../../worker/types';\nimport { DiffsHighlighter } from '../DiffsHighlighter';\nimport { attachResolvedLanguages } from '../languages/attachResolvedLanguages';\nimport { RegisteredCustomLanguages } from '../languages/constants';\nimport { resolveLanguages } from '../languages/resolveLanguages';\nimport { ShikiEditorTokenizer } from '../shiki-editor';\nimport { ShikiStreamTokenizer } from '../shiki-stream';\nimport { createDiffsThemeResolver } from '../themes/themeResolver';\nimport type { DiffsTheme } from '../themes/types';\nimport type {\n DiffsEditorTokenizerOptions,\n DiffsStreamTokenizer,\n} from '../tokenizer-types';\nimport type { CodeToTokensOptions, TokensResult } from '../types';\n\ntype ShikiHighlighterTypes = 'shiki-js' | 'shiki-wasm';\n\nexport class ShikiHighlighter extends DiffsHighlighter {\n // Compare theme objects to detect replacements, and retain them when the\n // shared cache is cleared.\n private readonly loadedThemes = new Map<string, DiffsTheme>();\n // Shiki allocates a new language list on each lookup.\n private readonly attachedLanguages = new Set(['text', 'ansi']);\n\n static async create(name: ShikiHighlighterTypes): Promise<ShikiHighlighter> {\n const engine =\n name === 'shiki-wasm'\n ? (await import('shiki/engine/oniguruma')).createOnigurumaEngine(\n import('shiki/wasm')\n )\n : (\n await import('shiki/engine/javascript')\n ).createJavaScriptRegexEngine();\n const raw = await createHighlighterCore({ themes: [], langs: [], engine });\n return new ShikiHighlighter(name, raw);\n }\n\n private constructor(\n name: ShikiHighlighterTypes,\n private readonly raw: HighlighterCore\n ) {\n super(name, createDiffsThemeResolver(name));\n }\n\n getTheme(themeName: string): DiffsTheme {\n this.assertNotDisposed();\n const loaded = this.loadedThemes.get(themeName);\n const theme = this.themeResolver.getResolvedTheme(themeName) ?? loaded;\n if (theme == null) {\n throw new Error(`Theme \"${themeName}\" has not been resolved`);\n }\n if (loaded !== theme) {\n const textmate =\n theme.textmate ??\n (theme.cssVariables != null\n ? createCssVariablesTheme(theme.cssVariables)\n : undefined);\n if (textmate == null) {\n throw new Error(`Theme \"${themeName}\" does not support Shiki`);\n }\n // Pass the object to refresh colors, using the name tokenization looks up.\n this.raw.setTheme({ ...textmate, name: themeName });\n this.loadedThemes.set(themeName, theme);\n }\n return theme;\n }\n\n codeToTokens(code: string, options: CodeToTokensOptions): TokensResult {\n return this.raw.codeToTokens(code, this.resolveOptions(options));\n }\n\n createEditorTokenizer(\n options: DiffsEditorTokenizerOptions\n ): ShikiEditorTokenizer {\n return new ShikiEditorTokenizer(this.raw, options, this);\n }\n\n createStreamTokenizer(options: CodeToTokensOptions): DiffsStreamTokenizer {\n return new ShikiStreamTokenizer(this.raw, this.resolveOptions(options));\n }\n\n async loadLanguages(languages: readonly string[]): Promise<void> {\n this.assertNotDisposed();\n const missing = languages.filter(\n (language) => !this.attachedLanguages.has(language)\n );\n attachResolvedLanguages(await resolveLanguages(missing), this);\n }\n\n hasLoadedLanguages(languages: readonly string[]): boolean {\n if (this.disposed) {\n return false;\n }\n // Custom registrations count only when attached here; bundled grammars\n // loaded on the raw instance by other code are found in Shiki's list.\n let loaded: string[] | undefined;\n return languages.every((lang) => {\n if (this.attachedLanguages.has(lang)) {\n return true;\n }\n if (RegisteredCustomLanguages.has(lang)) {\n return false;\n }\n loaded ??= this.raw.getLoadedLanguages();\n return loaded.includes(lang);\n });\n }\n\n attachLanguages(languages: readonly ResolvedLanguage[]): void {\n this.assertNotDisposed();\n for (const lang of languages) {\n if (this.attachedLanguages.has(lang.name)) {\n continue;\n }\n const grammar = lang.data.find(\n (grammar) =>\n grammar.name === lang.name ||\n grammar.aliases?.includes(lang.name) === true\n );\n if (grammar == null) {\n throw new Error(\n `attachResolvedLanguages: No returned grammar declares \"${lang.name}\" as its name or an alias.`\n );\n }\n this.raw.loadLanguageSync(lang.data);\n // Shiki skips loaded grammars, which can leave new aliases unregistered.\n try {\n this.raw.getLanguage(lang.name);\n } catch {\n throw new Error(\n `attachResolvedLanguages: \"${grammar.name}\" is already loaded without alias \"${lang.name}\". Load the alias first or give the grammar a unique name.`\n );\n }\n this.attachedLanguages.add(lang.name);\n }\n }\n\n protected releaseResources(): void {\n this.loadedThemes.clear();\n this.attachedLanguages.clear();\n this.raw.dispose();\n }\n\n // Attach resolved themes before tokenizing. Omit the unused key because\n // Shiki treats `themes: undefined` as a request for multiple themes.\n private resolveOptions({\n theme,\n themes,\n ...options\n }: CodeToTokensOptions): ShikiCodeToTokensOptions {\n this.assertNotDisposed();\n if (theme != null) {\n this.getTheme(theme);\n return { ...options, theme };\n }\n if (themes == null) {\n throw new Error('A theme or themes option is required');\n }\n for (const name of Object.values(themes)) {\n this.getTheme(name);\n }\n return { ...options, themes };\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shiki-Ci4cdHsM.js","names":[],"sources":["../../src/highlighter/languages/resolveLanguage.ts","../../src/highlighter/languages/getResolvedOrResolveLanguage.ts","../../src/highlighter/languages/resolveLanguages.ts","../../src/editor/utils.ts","../../src/highlighter/shiki-editor.ts","../../src/highlighter/shiki-stream.ts","../../src/highlighter/backends/shiki.ts"],"sourcesContent":["import type { BundledLanguage } from 'shiki';\n\nimport type { SupportedLanguages } from '../../types';\nimport { isWorkerContext } from '../../utils/isWorkerContext';\nimport type { ResolvedLanguage } from '../../worker';\nimport {\n RegisteredCustomLanguages,\n ResolvedLanguages,\n ResolvingLanguages,\n} from './constants';\n\ndeclare const __DIFFS_WORKER__: boolean | undefined;\n\nexport async function resolveLanguage(\n lang: Exclude<SupportedLanguages, 'text' | 'ansi'>\n): Promise<ResolvedLanguage> {\n if (\n typeof __DIFFS_WORKER__ !== 'undefined'\n ? __DIFFS_WORKER__\n : isWorkerContext()\n ) {\n throw new Error(\n `resolveLanguage(\"${lang}\") cannot be called from a worker context. Languages must be pre-resolved on the main thread and passed to the worker via the resolvedLanguages parameter.`\n );\n }\n const pending = ResolvingLanguages.get(lang);\n if (pending != null) return pending;\n const resolver = (async () => {\n let loader = RegisteredCustomLanguages.get(lang);\n if (loader == null) {\n const { bundledLanguages } = await import('shiki/langs');\n if (Object.prototype.hasOwnProperty.call(bundledLanguages, lang))\n loader = bundledLanguages[lang as BundledLanguage];\n }\n if (loader == null)\n throw new Error(\n `resolveLanguage: \"${lang}\" not found in bundled or custom languages`\n );\n const { default: data } = await loader();\n const resolvedLang = { name: lang, data };\n if (!ResolvedLanguages.has(lang)) ResolvedLanguages.set(lang, resolvedLang);\n return resolvedLang;\n })();\n ResolvingLanguages.set(lang, resolver);\n try {\n return await resolver;\n } finally {\n if (ResolvingLanguages.get(lang) === resolver)\n ResolvingLanguages.delete(lang);\n }\n}\n","import type { SupportedLanguages } from '../../types';\nimport type { ResolvedLanguage } from '../../worker';\nimport { ResolvedLanguages } from './constants';\nimport { resolveLanguage } from './resolveLanguage';\n\nexport function getResolvedOrResolveLanguage(\n language: Exclude<SupportedLanguages, 'text' | 'ansi'>\n): ResolvedLanguage | Promise<ResolvedLanguage> {\n return ResolvedLanguages.get(language) ?? resolveLanguage(language);\n}\n","import type { SupportedLanguages } from '../../types';\nimport type { ResolvedLanguage } from '../../worker';\nimport { getResolvedOrResolveLanguage } from './getResolvedOrResolveLanguage';\nimport { resolveLanguage } from './resolveLanguage';\n\nexport async function resolveLanguages(\n languages: SupportedLanguages[]\n): Promise<ResolvedLanguage[]> {\n const resolvedLanguages: ResolvedLanguage[] = [];\n const languagesToResolve: Promise<ResolvedLanguage | undefined>[] = [];\n for (const language of languages) {\n if (language === 'text' || language === 'ansi') continue;\n const maybeResolvedLanguage =\n getResolvedOrResolveLanguage(language) ?? resolveLanguage(language);\n if ('then' in maybeResolvedLanguage) {\n languagesToResolve.push(maybeResolvedLanguage);\n } else {\n resolvedLanguages.push(maybeResolvedLanguage);\n }\n }\n if (languagesToResolve.length > 0) {\n await Promise.all(languagesToResolve).then((_resolvedLanguages) => {\n for (const resolvedLanguage of _resolvedLanguages) {\n if (resolvedLanguage == null) {\n throw new Error('resolvedLanguages: unable to resolve language');\n }\n resolvedLanguages.push(resolvedLanguage);\n }\n });\n }\n\n return resolvedLanguages;\n}\n","export function h<K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n props?: {\n style?: string | Partial<CSSStyleDeclaration>;\n dataset?: DOMStringMap | string[] | string;\n children?: (Node | string)[];\n } & Partial<Omit<HTMLElementTagNameMap[K], 'style' | 'dataset' | 'children'>>,\n parent?: Element | ShadowRoot | DocumentFragment\n): HTMLElementTagNameMap[K] {\n const { style, dataset, children, ...attrs } = props ?? {};\n const el = document.createElement(tagName);\n Object.assign(el, attrs);\n if (style !== undefined) {\n if (typeof style === 'string') {\n el.style.cssText = style;\n } else {\n Object.assign(el.style, style);\n }\n }\n if (dataset !== undefined) {\n if (typeof dataset === 'string') {\n el.dataset[dataset] = '';\n } else if (Array.isArray(dataset)) {\n dataset.forEach((key) => {\n el.dataset[key] = '';\n });\n } else {\n Object.assign(el.dataset, dataset);\n }\n }\n if (children !== undefined) {\n el.replaceChildren(...children);\n }\n if (parent !== undefined) {\n parent.appendChild(el);\n }\n return el;\n}\n\nexport function isPromise<T>(value: T | Promise<T>): value is Promise<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function'\n );\n}\n\nexport function addEventListener<K extends keyof HTMLElementEventMap>(\n el: HTMLElement,\n event: K,\n listener: (this: HTMLElement, evt: HTMLElementEventMap[K]) => void,\n options?: AddEventListenerOptions\n): () => void;\nexport function addEventListener<K extends keyof DocumentEventMap>(\n el: Document,\n event: K,\n listener: (this: Document, evt: DocumentEventMap[K]) => void,\n options?: AddEventListenerOptions\n): () => void;\nexport function addEventListener<K extends keyof WindowEventMap>(\n el: Window,\n event: K,\n listener: (this: Window, evt: WindowEventMap[K]) => void,\n options?: AddEventListenerOptions\n): () => void;\nexport function addEventListener<K extends keyof MediaQueryListEventMap>(\n el: MediaQueryList,\n event: K,\n listener: (this: MediaQueryList, evt: MediaQueryListEventMap[K]) => void,\n options?: AddEventListenerOptions\n): () => void;\nexport function addEventListener(\n el: HTMLElement | Document | ShadowRoot | Window | MediaQueryList,\n event: string,\n listener: EventListener,\n options?: AddEventListenerOptions\n) {\n el.addEventListener(event, listener, options);\n return () => el.removeEventListener(event, listener, options);\n}\n\nexport function getLineNumberAttr(\n el: HTMLElement,\n key = 'line'\n): number | undefined {\n const value = el.dataset[key];\n if (value === undefined) {\n return undefined;\n }\n const lineNumber = parseInt(value, 10);\n if (Number.isNaN(lineNumber)) {\n return undefined;\n }\n return lineNumber;\n}\n\nexport function clampDomOffset(node: Node, offset: number): number {\n if (node.nodeType === 3) {\n const length = (node as Text).textContent?.length ?? 0;\n return Math.max(0, Math.min(offset, length));\n }\n if (node.nodeType === 1) {\n return Math.max(0, Math.min(offset, node.childNodes.length));\n }\n return 0;\n}\n\nexport function extend<T extends object>(obj: T, attrs: Partial<T>): T {\n return Object.assign(obj, attrs);\n}\n\n// oxlint-disable-next-line typescript/no-explicit-any\nexport function debounce<T extends (...args: any[]) => void>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: ReturnType<typeof setTimeout>;\n return function (this: ThisType<T>, ...args: Parameters<T>) {\n clearTimeout(timeout);\n timeout = setTimeout(() => func.apply(this, args), wait);\n };\n}\n\nexport function round(value: number, precision: number = 1000): number {\n return Math.round(value * precision) / precision;\n}\n\nexport function endsWithLineBreak(text: string): boolean {\n return text.endsWith('\\n') || text.endsWith('\\r');\n}\n\n// Creates an Intl.Segmenter, or undefined when the engine lacks support.\n// Callers must fall back to a degraded path when this returns undefined.\nexport function createSegmenter(\n options: Intl.SegmenterOptions\n): Intl.Segmenter | undefined {\n if (typeof Intl === 'undefined' || typeof Intl.Segmenter !== 'function') {\n return undefined;\n }\n return new Intl.Segmenter(undefined, options);\n}\n\n// Lazily created and cached grapheme segmenter. Avoids constructing\n// Intl.Segmenter at import time so importing the editor never throws on\n// engines that lack it. Undefined when the engine has no Intl.Segmenter.\nlet graphemeSegmenter: Intl.Segmenter | undefined;\nlet graphemeSegmenterInit = false;\nexport function getGraphemeSegmenter(): Intl.Segmenter | undefined {\n if (!graphemeSegmenterInit) {\n graphemeSegmenter = createSegmenter({ granularity: 'grapheme' });\n graphemeSegmenterInit = true;\n }\n return graphemeSegmenter;\n}\n\n// lookup the scroll container for the given element\nexport function lookupScrollContainer(\n element: HTMLElement\n): HTMLElement | Document {\n const ownerDocument = element.ownerDocument;\n let parentElement = element.parentElement;\n while (\n parentElement != null &&\n parentElement !== ownerDocument.body &&\n parentElement !== ownerDocument.documentElement\n ) {\n const overflowY =\n parentElement.ownerDocument.defaultView?.getComputedStyle(\n parentElement\n ).overflowY;\n if (\n overflowY === 'auto' ||\n overflowY === 'scroll' ||\n overflowY === 'overlay'\n ) {\n return parentElement;\n }\n parentElement = parentElement.parentElement;\n }\n return ownerDocument;\n}\n","import type { HighlighterCore } from 'shiki/core';\nimport {\n EncodedTokenMetadata,\n type IGrammar,\n INITIAL,\n type StateStack,\n} from 'shiki/textmate';\n\nimport type { TextDocumentChange } from '../editor/textDocument';\nimport { debounce } from '../editor/utils';\nimport type { HighlightedToken, RenderRange } from '../types';\nimport type { DiffsEditorTokenizer } from './DiffsEditorTokenizer';\nimport type { DiffsEditorTokenizerOptions } from './tokenizer-types';\nimport type { DiffsHighlighter } from './types';\n\n// Timed aborts can leave incomplete grammar state; limit line length instead.\nconst TOKENIZE_TIME_LIMIT = 0;\nlet nextTokenizerId = 0;\n\n/** TextMate state caching and background work for a single editable document. */\nexport class ShikiEditorTokenizer implements DiffsEditorTokenizer {\n #highlighter: HighlighterCore;\n #grammar: IGrammar | undefined;\n #themeName: string;\n #colorMap: string[];\n #textDocument: DiffsEditorTokenizerOptions['textDocument'];\n #tokenizeMaxLineLength: number;\n #onDeferTokenize: DiffsEditorTokenizerOptions['onDeferTokenize'];\n #matchBrackets: boolean;\n #debug: boolean;\n #isCleanedUp = false;\n #stateStack: StateStack[] = [INITIAL]; // cached state stack by line index\n #comparisonStateStack: StateStack[] = [];\n #comparisonStateStackStart = 0;\n #comparisonLineChanges: NonNullable<\n TextDocumentChange['changedLineChanges']\n > = [];\n #lastLine: number = -1;\n #isStopped: boolean = true;\n #isPaused: boolean = false;\n #backgroundJobId: number = 0;\n #tokenizerId = ++nextTokenizerId;\n #backgroundPrebuildEndLine = -1;\n #pendingPrebuildEndLine = -1;\n #backgroundChangedLineRanges: readonly [number, number][] | undefined;\n #backgroundChangedRangeIndex: number = 0;\n #bracketIgnoredRanges: ([number, number][] | null | undefined)[] = [];\n #isMessageListenerAttached: boolean = false;\n\n #prebuildStateStack = debounce(async (renderRange?: RenderRange) => {\n // A queued timer may run after the highlighter is disposed.\n if (this.#isCleanedUp) {\n return;\n }\n const { startingLine = 0, totalLines = Infinity } = renderRange ?? {};\n const endLine = Math.min(\n totalLines === Infinity ? Infinity : startingLine + totalLines,\n this.#textDocument.lineCount\n );\n if (\n this.#grammar == null &&\n !isGrammarlessLanguage(this.#textDocument.languageId)\n ) {\n await this.backend?.loadLanguages([this.#textDocument.languageId]);\n if (this.#isCleanedUp) {\n return;\n }\n this.#grammar = this.#highlighter.getLanguage(\n this.#textDocument.languageId\n );\n }\n this.#ensureActiveTheme();\n this.#scheduleStatePrebuild(endLine);\n }, 500);\n\n #onMessage = ({ data }: MessageEvent<unknown>) => {\n if (typeof data !== 'object' || data === null) {\n return;\n }\n const { type, tokenizerId, jobId } = data as {\n type?: unknown;\n tokenizerId?: unknown;\n jobId?: unknown;\n };\n if (\n type === 'tokenize' &&\n tokenizerId === this.#tokenizerId &&\n typeof jobId === 'number' &&\n jobId === this.#backgroundJobId\n ) {\n if (this.#backgroundPrebuildEndLine >= 0) {\n this.#backgroundPrebuild(jobId);\n } else {\n this.#backgroundTokenize(jobId);\n }\n }\n };\n\n getStringCommentRegexpRangesInLine(\n lineIndex: number\n ): [number, number][] | null {\n if (\n !this.#matchBrackets ||\n lineIndex < 0 ||\n lineIndex >= this.#textDocument.lineCount\n ) {\n return null;\n }\n this.#ensureGrammar();\n if (this.#grammar == null) {\n return null;\n }\n if (this.#bracketIgnoredRanges[lineIndex] === undefined) {\n this.#buildStateStack(lineIndex);\n const state = this.#stateStack[lineIndex] ?? INITIAL;\n const result = this.#tokenizeLineAt(lineIndex, state);\n this.#stateStack[lineIndex + 1] = result.state;\n }\n return this.#bracketIgnoredRanges[lineIndex] ?? null;\n }\n\n constructor(\n highlighter: HighlighterCore,\n options: DiffsEditorTokenizerOptions,\n private readonly backend?: Pick<\n DiffsHighlighter,\n 'getTheme' | 'loadLanguages'\n >\n ) {\n this.#highlighter = highlighter;\n this.#textDocument = options.textDocument;\n this.#themeName = options.theme;\n this.#colorMap = [];\n // The cutoff must match codeToTokens and Highlights: length >= limit.\n this.#tokenizeMaxLineLength = options.tokenizeMaxLineLength ?? 1000;\n this.#onDeferTokenize = options.onDeferTokenize;\n this.#matchBrackets = options.matchBrackets !== false;\n this.#debug = options.__debug ?? false;\n this.#ensureGrammar();\n this.#ensureActiveTheme();\n }\n\n setTheme(themeName: string): void {\n if (this.#themeName === themeName) return;\n this.#themeName = themeName;\n this.#ensureActiveTheme();\n this.stopBackgroundTokenize();\n this.#stateStack = [INITIAL];\n this.#comparisonStateStack = [];\n this.#comparisonStateStackStart = 0;\n this.#comparisonLineChanges = [];\n if (this.#grammar != null && this.#textDocument.lineCount > 0) {\n this.#scheduleBackgroundTokenize(0);\n }\n }\n\n // Dual-theme SSR can change the shared highlighter's active theme. Restore\n // the editor theme before tokenizing so color indices match its color map.\n #ensureActiveTheme(): void {\n if (this.#themeName === '') {\n return;\n }\n // Resolving a theme does not attach it to Shiki until the backend uses it.\n this.backend?.getTheme(this.#themeName);\n const { colorMap } = this.#highlighter.setTheme(this.#themeName);\n this.#colorMap = colorMap;\n }\n\n dispose(): void {\n this.#isCleanedUp = true;\n this.stopBackgroundTokenize();\n this.#detachMessageListener();\n }\n\n // Prebuild viewport state with prebuildStateStack before the first edit.\n tokenize(\n change: TextDocumentChange,\n renderRange?: RenderRange,\n hostRealignsRows = false\n ): Map<number, Array<HighlightedToken>> {\n this.#ensureGrammar();\n this.#ensureActiveTheme();\n if (\n this.#grammar == null &&\n !isGrammarlessLanguage(this.#textDocument.languageId)\n ) {\n throw new Error(\n `Grammar for language \"${this.#textDocument.languageId}\" not loaded`\n );\n }\n\n const { lineCount } = this.#textDocument;\n const { startingLine = 0, totalLines = Infinity } = renderRange ?? {};\n const renderRangeEndLine =\n totalLines === Infinity\n ? lineCount\n : Math.min(startingLine + totalLines, lineCount);\n\n const dirtyStart = change.startLine;\n const viewStart = Math.max(startingLine, dirtyStart);\n const crossesRenderRangeEnd =\n renderRange != null &&\n totalLines !== Infinity &&\n change.lineDelta > 0 &&\n dirtyStart < renderRangeEndLine &&\n change.endLine >= renderRangeEndLine;\n const canReuseCachedStates =\n change.lineDelta === 0 &&\n (change.changedLineChanges?.every(([, , lineDelta]) => lineDelta === 0) ??\n true);\n if (this.#matchBrackets && !canReuseCachedStates) {\n // Structural edits shift line indexes; only the unchanged prefix is valid.\n this.#bracketIgnoredRanges.length = Math.min(\n this.#bracketIgnoredRanges.length,\n change.startLine\n );\n }\n const canReuseShiftedStates =\n hostRealignsRows && change.lineDelta !== 0 && dirtyStart >= startingLine;\n const canCacheTokenizedStates =\n canReuseCachedStates || renderRange == null || dirtyStart >= viewStart;\n const changedLineRanges: readonly [number, number][] =\n change.changedLineRanges ?? [[dirtyStart, change.endLine]];\n this.#comparisonStateStack = [];\n this.#comparisonStateStackStart = 0;\n this.#comparisonLineChanges = [];\n let offscreenSyncEnd = -1;\n if (dirtyStart < viewStart) {\n for (const [rangeStart, rangeEnd] of changedLineRanges) {\n if (rangeStart < viewStart) {\n offscreenSyncEnd = Math.max(\n offscreenSyncEnd,\n Math.min(rangeEnd, viewStart - 1)\n );\n }\n }\n }\n const shouldFlushOffscreenLines =\n offscreenSyncEnd >= dirtyStart &&\n (canReuseCachedStates || change.lineDelta < 0);\n if (canReuseCachedStates) {\n this.#buildStateStack(dirtyStart);\n } else {\n this.#shiftComparisonStateStack(change);\n if (renderRange == null || dirtyStart >= viewStart) {\n this.#buildStateStack(viewStart);\n }\n }\n\n let changedRangeIndex = 0;\n let currentChangedRangeEnd = changedLineRanges[changedRangeIndex][1];\n let backgroundStartLine: number | undefined;\n let backgroundChangedRangeIndex = 0;\n let line = canReuseCachedStates\n ? changedLineRanges[changedRangeIndex][0]\n : viewStart;\n let settled = false;\n const dirtyLines: Map<number, Array<HighlightedToken>> = new Map();\n const offscreenDirtyLines:\n | Map<number, Array<HighlightedToken>>\n | undefined = shouldFlushOffscreenLines ? new Map() : undefined;\n if (offscreenDirtyLines != null && !canReuseCachedStates) {\n const offscreenEnd = Math.min(\n offscreenSyncEnd + 1,\n viewStart,\n renderRangeEndLine\n );\n if (offscreenEnd > dirtyStart) {\n this.#buildStateStack(offscreenEnd);\n let offscreenLine = dirtyStart;\n let offscreenState = this.#stateStack[offscreenLine] ?? INITIAL;\n for (; offscreenLine < offscreenEnd; offscreenLine++) {\n const resolved = this.#tokenizeLineAt(offscreenLine, offscreenState);\n offscreenState = resolved.state;\n offscreenDirtyLines.set(offscreenLine, resolved.resolvedTokens);\n }\n this.#stateStack[offscreenEnd] = offscreenState;\n }\n }\n // Read state after the offscreen flush; a deletion may have invalidated\n // the viewport's starting state inside a block comment or template literal.\n let state = this.#stateStack[line] ?? INITIAL;\n for (; line < renderRangeEndLine; ) {\n const previousNextState = canReuseCachedStates\n ? this.#stateStack[line + 1]\n : canReuseShiftedStates\n ? this.#getPreviousEndState(line + 1)\n : undefined;\n if (canCacheTokenizedStates) {\n this.#stateStack[line] = state;\n }\n\n const { resolvedTokens, state: nextState } = this.#tokenizeLineAt(\n line,\n state\n );\n state = nextState;\n\n if (line >= viewStart) {\n dirtyLines.set(line, resolvedTokens);\n } else {\n offscreenDirtyLines?.set(line, resolvedTokens);\n }\n\n if (canCacheTokenizedStates) {\n this.#stateStack[line + 1] = state;\n }\n settled =\n line >= currentChangedRangeEnd &&\n (canReuseCachedStates || canReuseShiftedStates) &&\n previousNextState != null &&\n state.equals(previousNextState);\n if (settled) {\n changedRangeIndex++;\n const nextRange = changedLineRanges[changedRangeIndex];\n if (nextRange == null) {\n break;\n }\n if (nextRange[0] >= renderRangeEndLine) {\n backgroundStartLine = nextRange[0];\n backgroundChangedRangeIndex = changedRangeIndex;\n break;\n }\n let nextState: StateStack | undefined = this.#stateStack[nextRange[0]];\n if (canReuseShiftedStates) {\n for (\n let stateLine = line + 2;\n stateLine <= nextRange[0];\n stateLine++\n ) {\n nextState = this.#getPreviousEndState(stateLine);\n if (nextState == null) {\n break;\n }\n this.#stateStack[stateLine] = nextState;\n }\n }\n if (nextState == null) {\n currentChangedRangeEnd = nextRange[1];\n line++;\n } else {\n line = nextRange[0];\n state = nextState;\n currentChangedRangeEnd = nextRange[1];\n }\n settled = false;\n continue;\n }\n line++;\n }\n\n if (canCacheTokenizedStates) {\n if (line < renderRangeEndLine) {\n this.#stateStack[line + 1] = state;\n } else {\n this.#stateStack[line] = state;\n }\n }\n\n if (settled && canReuseShiftedStates && backgroundStartLine == null) {\n for (let stateLine = line + 2; stateLine <= lineCount; stateLine++) {\n const previousState = this.#getPreviousEndState(stateLine);\n if (previousState == null) {\n break;\n }\n this.#stateStack[stateLine] = previousState;\n }\n this.#comparisonStateStack = [];\n this.#comparisonStateStackStart = 0;\n this.#comparisonLineChanges = [];\n }\n\n if (offscreenDirtyLines != null && offscreenDirtyLines.size > 0) {\n this.#onDeferTokenize(offscreenDirtyLines);\n }\n\n if (backgroundStartLine != null) {\n if (this.#matchBrackets && canReuseCachedStates) {\n this.#bracketIgnoredRanges.length = Math.min(\n this.#bracketIgnoredRanges.length,\n backgroundStartLine\n );\n }\n this.#scheduleBackgroundTokenize(\n backgroundStartLine,\n changedLineRanges,\n backgroundChangedRangeIndex\n );\n } else if (!settled && line < lineCount) {\n const backgroundLine =\n crossesRenderRangeEnd && dirtyStart >= viewStart\n ? renderRangeEndLine\n : dirtyStart < viewStart && !canReuseCachedStates\n ? dirtyStart\n : line;\n if (this.#matchBrackets && canReuseCachedStates) {\n this.#bracketIgnoredRanges.length = Math.min(\n this.#bracketIgnoredRanges.length,\n backgroundLine\n );\n }\n this.#scheduleBackgroundTokenize(\n backgroundLine,\n changedLineRanges,\n changedRangeIndex\n );\n }\n\n return dirtyLines;\n }\n\n prebuildStateStack(renderRange?: RenderRange): void {\n this.#ensureGrammar();\n this.#prebuildStateStack(renderRange);\n }\n\n stopBackgroundTokenize(): void {\n this.#pendingPrebuildEndLine = -1;\n if (this.#isStopped) {\n return;\n }\n this.#isStopped = true;\n this.#isPaused = false;\n this.#lastLine = -1;\n this.#backgroundPrebuildEndLine = -1;\n this.#backgroundChangedLineRanges = undefined;\n this.#backgroundChangedRangeIndex = 0;\n this.#comparisonStateStack = [];\n this.#comparisonStateStackStart = 0;\n this.#comparisonLineChanges = [];\n this.#detachMessageListener();\n }\n\n pauseBackgroundTokenize(): void {\n if (this.#isStopped || this.#isPaused) {\n return;\n }\n if (this.#debug) {\n console.log('[diffs/editor] background tokenization paused', {\n jobId: this.#backgroundJobId,\n });\n }\n this.#isPaused = true;\n }\n\n resumeBackgroundTokenize(): void {\n if (\n this.#isStopped ||\n !this.#isPaused ||\n this.#grammar == null ||\n this.#lastLine < 0\n ) {\n return;\n }\n if (this.#debug) {\n console.log('[diffs/editor] background tokenization resumed', {\n jobId: this.#backgroundJobId,\n });\n }\n this.#isPaused = false;\n this.#postTokenizeMessage(this.#backgroundJobId);\n }\n\n #ensureGrammar(): void {\n if (\n this.#grammar == null &&\n !isGrammarlessLanguage(this.#textDocument.languageId) &&\n this.#highlighter\n .getLoadedLanguages()\n .includes(this.#textDocument.languageId)\n ) {\n this.#grammar = this.#highlighter.getLanguage(\n this.#textDocument.languageId\n );\n }\n }\n\n #attachMessageListener(): void {\n if (this.#isMessageListenerAttached) {\n return;\n }\n globalThis.addEventListener('message', this.#onMessage);\n this.#isMessageListenerAttached = true;\n }\n\n #detachMessageListener(): void {\n if (!this.#isMessageListenerAttached) {\n return;\n }\n globalThis.removeEventListener('message', this.#onMessage);\n this.#isMessageListenerAttached = false;\n }\n\n #postTokenizeMessage(jobId: number): void {\n // use `postMessage` instead of `setTimeout(fn, 0)` to avoid 4ms delay\n globalThis.postMessage({\n type: 'tokenize',\n tokenizerId: this.#tokenizerId,\n jobId,\n });\n }\n\n #scheduleBackgroundTokenize(\n startLine: number,\n changedLineRanges?: readonly [number, number][],\n changedRangeIndex = 0\n ): void {\n if (isGrammarlessLanguage(this.#textDocument.languageId)) {\n return;\n }\n\n const jobId = ++this.#backgroundJobId;\n\n if (this.#debug) {\n console.log('[diffs/editor] background tokenization scheduled', {\n jobId,\n startLine,\n changedLineRanges,\n changedRangeIndex,\n });\n }\n\n this.#isStopped = false;\n this.#isPaused = false;\n this.#lastLine = startLine;\n if (this.#backgroundPrebuildEndLine >= 0) {\n this.#pendingPrebuildEndLine = Math.max(\n this.#pendingPrebuildEndLine,\n this.#backgroundPrebuildEndLine\n );\n }\n this.#backgroundPrebuildEndLine = -1;\n this.#backgroundChangedLineRanges = changedLineRanges;\n this.#backgroundChangedRangeIndex = changedRangeIndex;\n this.#attachMessageListener();\n this.#postTokenizeMessage(jobId);\n }\n\n #scheduleStatePrebuild(endLine: number): void {\n if (this.#grammar == null || this.#stateStack.length > endLine) {\n return;\n }\n // Extend an active prebuild, or retain the target until the foreground\n // edit job reconverges and releases the state cache.\n if (!this.#isStopped) {\n if (this.#backgroundPrebuildEndLine >= 0) {\n this.#backgroundPrebuildEndLine = Math.max(\n this.#backgroundPrebuildEndLine,\n endLine\n );\n } else {\n this.#pendingPrebuildEndLine = Math.max(\n this.#pendingPrebuildEndLine,\n endLine\n );\n }\n return;\n }\n\n const jobId = ++this.#backgroundJobId;\n this.#isStopped = false;\n this.#isPaused = false;\n this.#lastLine = this.#stateStack.length - 1;\n this.#backgroundPrebuildEndLine = endLine;\n this.#pendingPrebuildEndLine = -1;\n this.#backgroundChangedLineRanges = undefined;\n this.#backgroundChangedRangeIndex = 0;\n this.#attachMessageListener();\n this.#postTokenizeMessage(jobId);\n }\n\n #tokenizeLineAt(\n line: number,\n state: StateStack\n ): { resolvedTokens: Array<HighlightedToken>; state: StateStack } {\n const lineText = this.#textDocument.getLineText(line);\n if (lineText.length >= this.#tokenizeMaxLineLength) {\n console.warn(\n `[diffs] Line(${line}) too long to tokenize: ${lineText.length}`\n );\n this.#cacheBracketIgnoredRanges(line, null);\n return { resolvedTokens: [[0, '', lineText]], state };\n }\n if (this.#grammar == null || lineText === '' || lineText.trim() === '') {\n this.#cacheBracketIgnoredRanges(line, null);\n return { resolvedTokens: [[0, '', lineText]], state };\n }\n const result = tokenizeLine(\n this.#grammar,\n this.#colorMap,\n lineText,\n state,\n TOKENIZE_TIME_LIMIT,\n this.#matchBrackets\n );\n this.#cacheBracketIgnoredRanges(line, result.bracketIgnoredRanges);\n return {\n resolvedTokens: result.resolvedTokens,\n state: result.ruleStack,\n };\n }\n\n #cacheBracketIgnoredRanges(\n line: number,\n ranges: [number, number][] | null\n ): void {\n if (this.#matchBrackets) {\n this.#bracketIgnoredRanges[line] = ranges;\n }\n }\n\n // Preserve old end states as comparison-only sentinels, copying whichever\n // side of the edit is smaller. Index shifts are resolved lazily on lookup.\n #shiftComparisonStateStack(change: TextDocumentChange): void {\n const lineChanges =\n change.changedLineChanges ??\n ([[change.startLine, change.endLine, change.lineDelta]] as const);\n const comparisonStart = change.startLine + 1;\n const comparisonLength = this.#stateStack.length - comparisonStart;\n if (comparisonStart <= comparisonLength) {\n this.#comparisonStateStack = this.#stateStack;\n this.#comparisonStateStackStart = 0;\n this.#stateStack = this.#stateStack.slice(0, comparisonStart);\n } else {\n this.#comparisonStateStackStart = comparisonStart;\n this.#comparisonStateStack = this.#stateStack.slice(comparisonStart);\n this.#stateStack.length = Math.min(\n this.#stateStack.length,\n comparisonStart\n );\n }\n this.#comparisonLineChanges = lineChanges;\n }\n\n #getPreviousEndState(line: number): StateStack | undefined {\n let previousLine = line;\n for (\n let index = this.#comparisonLineChanges.length - 1;\n index >= 0;\n index--\n ) {\n const [startLine, endLine, lineDelta] =\n this.#comparisonLineChanges[index];\n if (lineDelta === 0) {\n continue;\n }\n if (previousLine > endLine) {\n previousLine -= lineDelta;\n } else if (previousLine > startLine) {\n return this.#stateStack[line];\n }\n }\n return (\n this.#comparisonStateStack[\n previousLine - this.#comparisonStateStackStart\n ] ?? this.#stateStack[line]\n );\n }\n\n #buildStateStack(endAt: number, timeBudget?: number): boolean {\n const boundedEndAt = Math.min(\n Math.max(0, endAt),\n this.#textDocument.lineCount\n );\n if (this.#stateStack.length > boundedEndAt || this.#grammar == null) {\n return true;\n }\n const startedAt = timeBudget == null ? 0 : performance.now();\n let line = this.#stateStack.length - 1;\n let state = this.#stateStack[line] ?? INITIAL;\n while (line < boundedEndAt) {\n this.#stateStack[line] = state;\n const lineText = this.#textDocument.getLineText(line);\n if (\n lineText.length < this.#tokenizeMaxLineLength &&\n lineText !== '' &&\n lineText.trim() !== ''\n ) {\n const result = tokenizeLine(\n this.#grammar,\n this.#colorMap,\n lineText,\n state,\n TOKENIZE_TIME_LIMIT,\n this.#matchBrackets,\n false\n );\n this.#cacheBracketIgnoredRanges(line, result.bracketIgnoredRanges);\n state = result.ruleStack;\n } else {\n this.#cacheBracketIgnoredRanges(line, null);\n }\n line++;\n this.#stateStack[line] = state;\n if (timeBudget != null && performance.now() - startedAt > timeBudget) {\n break;\n }\n }\n return line >= boundedEndAt;\n }\n\n #backgroundPrebuild(jobId: number): void {\n if (\n this.#isStopped ||\n this.#isPaused ||\n this.#grammar == null ||\n jobId !== this.#backgroundJobId\n ) {\n return;\n }\n\n this.#ensureActiveTheme();\n // State prebuilds intentionally omit rendered tokens and yield between\n // short chunks so a deep viewport does not monopolize the main thread.\n const complete = this.#buildStateStack(this.#backgroundPrebuildEndLine, 1);\n if (this.#isStopped || this.#isPaused || jobId !== this.#backgroundJobId) {\n return;\n }\n if (complete) {\n this.stopBackgroundTokenize();\n return;\n }\n this.#lastLine = this.#stateStack.length - 1;\n this.#postTokenizeMessage(jobId);\n }\n\n #backgroundTokenize(jobId: number) {\n if (\n this.#isStopped ||\n this.#isPaused ||\n this.#grammar == null ||\n jobId !== this.#backgroundJobId\n ) {\n return;\n }\n\n this.#ensureActiveTheme();\n\n const t = performance.now();\n const lines = new Map<number, Array<HighlightedToken>>();\n const totalLines = this.#textDocument.lineCount;\n const changedLineRanges = this.#backgroundChangedLineRanges;\n\n let line = this.#lastLine;\n let state = this.#stateStack[line] ?? INITIAL;\n let settled = false;\n let changedRangeIndex = this.#backgroundChangedRangeIndex;\n let currentChangedRangeEnd = changedLineRanges?.[changedRangeIndex]?.[1];\n for (; line < totalLines; ) {\n this.#stateStack[line] = state;\n\n const previousNextState =\n currentChangedRangeEnd != null\n ? this.#getPreviousEndState(line + 1)\n : undefined;\n const result = this.#tokenizeLineAt(line, state);\n lines.set(line, result.resolvedTokens);\n state = result.state;\n\n this.#stateStack[line + 1] = state;\n settled =\n currentChangedRangeEnd != null &&\n line >= currentChangedRangeEnd &&\n previousNextState != null &&\n state.equals(previousNextState);\n line++;\n if (settled) {\n changedRangeIndex++;\n const nextRange = changedLineRanges?.[changedRangeIndex];\n if (nextRange == null) {\n break;\n }\n currentChangedRangeEnd = nextRange[1];\n if (this.#stateStack[nextRange[0]] == null) {\n settled = false;\n } else {\n line = nextRange[0];\n state = this.#stateStack[line] ?? state;\n settled = false;\n continue;\n }\n }\n\n // limit the time of partial tokenize to 1ms\n if (performance.now() - t > 1) {\n break;\n }\n }\n\n this.#onDeferTokenize(lines);\n if (this.#isStopped || this.#isPaused || jobId !== this.#backgroundJobId) {\n return;\n }\n\n if (settled || line >= totalLines) {\n const pendingPrebuildEndLine = this.#pendingPrebuildEndLine;\n this.stopBackgroundTokenize();\n if (pendingPrebuildEndLine >= 0) {\n this.#scheduleStatePrebuild(pendingPrebuildEndLine);\n }\n return;\n }\n\n this.#lastLine = line;\n this.#backgroundChangedRangeIndex = changedRangeIndex;\n this.#postTokenizeMessage(jobId);\n }\n}\n\nfunction tokenizeLine(\n grammar: IGrammar,\n colorMap: string[],\n lineText: string,\n stateStack: StateStack,\n timeLimit?: number,\n collectBracketIgnoredRanges = true,\n resolveTokens = true\n): {\n ruleStack: StateStack;\n resolvedTokens: Array<HighlightedToken>;\n bracketIgnoredRanges: [number, number][];\n} {\n const result = grammar.tokenizeLine2(lineText, stateStack, timeLimit);\n if (result.stoppedEarly) {\n console.warn(\n `[diffs] Time limit reached when tokenizing line: ${lineText.substring(0, 100)}`\n );\n }\n const rawTokens = result.tokens;\n const tokensLength = rawTokens.length / 2;\n const resolvedTokens: Array<HighlightedToken> = [];\n const bracketIgnoredRanges: [number, number][] = [];\n if (!resolveTokens && !collectBracketIgnoredRanges) {\n return {\n ruleStack: result.ruleStack,\n resolvedTokens,\n bracketIgnoredRanges,\n };\n }\n for (let j = 0; j < tokensLength; j++) {\n const offset = rawTokens[2 * j];\n const nextOffset =\n j + 1 < tokensLength ? rawTokens[2 * j + 2] : lineText.length;\n if (offset === nextOffset) {\n // should never reach here, skip if happens anyway\n continue;\n }\n const metadata = rawTokens[2 * j + 1];\n if (resolveTokens) {\n const fg = EncodedTokenMetadata.getForeground(metadata);\n resolvedTokens.push([\n offset,\n colorMap[fg],\n lineText.slice(offset, nextOffset),\n ]);\n }\n if (\n collectBracketIgnoredRanges &&\n EncodedTokenMetadata.getTokenType(metadata) > 0\n ) {\n bracketIgnoredRanges.push([offset, nextOffset]);\n }\n }\n return {\n ruleStack: result.ruleStack,\n resolvedTokens,\n bracketIgnoredRanges,\n };\n}\n\n// Shiki special-cases `text` and `ansi` in codeToHast but does not expose grammars.\nfunction isGrammarlessLanguage(languageId: string): boolean {\n return languageId === 'text' || languageId === 'ansi';\n}\n","import type {\n CodeToTokensOptions,\n GrammarState,\n HighlighterCore,\n} from 'shiki/core';\n\nimport { appendItems } from '../utils/appendItems';\nimport { BaseStreamTokenizer } from './stream-tokenizer';\nimport type { ThemedToken } from './types';\n\nexport class ShikiStreamTokenizer extends BaseStreamTokenizer {\n // Text of the provisional line; it is tokenized again with each chunk.\n #tail = '';\n #grammarState: GrammarState | undefined;\n\n constructor(\n private readonly highlighter: HighlighterCore,\n private readonly options: CodeToTokensOptions\n ) {\n super();\n }\n\n protected tokenizeChunk(\n chunk: string,\n stable: ThemedToken[]\n ): { unstable: ThemedToken[]; tailLength: number } {\n const chunkLines = (this.#tail + chunk).split(/(\\r\\n|\\r|\\n)/);\n let unstable: ThemedToken[] = [];\n for (let i = 0; i < chunkLines.length; i += 2) {\n const line = chunkLines[i];\n const result = this.highlighter.codeToTokens(line, {\n ...this.options,\n grammarState: this.#grammarState,\n });\n const tokens = result.tokens[0].map((token) => ({\n ...token,\n offset: token.offset + this.stableOffset,\n }));\n if (i + 1 < chunkLines.length) {\n appendItems(stable, tokens);\n this.pushLineBreak(stable, line.length, chunkLines[i + 1]);\n this.#grammarState = result.grammarState;\n } else {\n unstable = tokens;\n this.#tail = line;\n }\n }\n return { unstable, tailLength: this.#tail.length };\n }\n\n clone(): ShikiStreamTokenizer {\n this.assertActive();\n const clone = new ShikiStreamTokenizer(this.highlighter, this.options);\n this.copyStateTo(clone);\n clone.#tail = this.#tail;\n clone.#grammarState = this.#grammarState;\n return clone;\n }\n\n protected resetSource(): void {\n this.#tail = '';\n this.#grammarState = undefined;\n }\n\n protected releaseSource(): void {\n this.resetSource();\n }\n}\n","import {\n createCssVariablesTheme,\n createHighlighterCore,\n type HighlighterCore,\n type CodeToTokensOptions as ShikiCodeToTokensOptions,\n} from 'shiki/core';\n\nimport type { ResolvedLanguage } from '../../worker/types';\nimport { DiffsHighlighter } from '../DiffsHighlighter';\nimport { attachResolvedLanguages } from '../languages/attachResolvedLanguages';\nimport { RegisteredCustomLanguages } from '../languages/constants';\nimport { resolveLanguages } from '../languages/resolveLanguages';\nimport { ShikiEditorTokenizer } from '../shiki-editor';\nimport { ShikiStreamTokenizer } from '../shiki-stream';\nimport { createDiffsThemeResolver } from '../themes/themeResolver';\nimport type { DiffsTheme } from '../themes/types';\nimport type {\n DiffsEditorTokenizerOptions,\n DiffsStreamTokenizer,\n} from '../tokenizer-types';\nimport type { CodeToTokensOptions, TokensResult } from '../types';\n\ntype ShikiHighlighterTypes = 'shiki-js' | 'shiki-wasm';\n\nexport class ShikiHighlighter extends DiffsHighlighter {\n // Compare theme objects to detect replacements, and retain them when the\n // shared cache is cleared.\n private readonly loadedThemes = new Map<string, DiffsTheme>();\n // Shiki allocates a new language list on each lookup.\n private readonly attachedLanguages = new Set(['text', 'ansi']);\n\n static async create(name: ShikiHighlighterTypes): Promise<ShikiHighlighter> {\n const engine =\n name === 'shiki-wasm'\n ? (await import('shiki/engine/oniguruma')).createOnigurumaEngine(\n import('shiki/wasm')\n )\n : (\n await import('shiki/engine/javascript')\n ).createJavaScriptRegexEngine();\n const raw = await createHighlighterCore({ themes: [], langs: [], engine });\n return new ShikiHighlighter(name, raw);\n }\n\n private constructor(\n name: ShikiHighlighterTypes,\n private readonly raw: HighlighterCore\n ) {\n super(name, createDiffsThemeResolver(name));\n }\n\n getTheme(themeName: string): DiffsTheme {\n this.assertNotDisposed();\n const loaded = this.loadedThemes.get(themeName);\n const theme = this.themeResolver.getResolvedTheme(themeName) ?? loaded;\n if (theme == null) {\n throw new Error(`Theme \"${themeName}\" has not been resolved`);\n }\n if (loaded !== theme) {\n const textmate =\n theme.textmate ??\n (theme.cssVariables != null\n ? createCssVariablesTheme(theme.cssVariables)\n : undefined);\n if (textmate == null) {\n throw new Error(`Theme \"${themeName}\" does not support Shiki`);\n }\n // Pass the object to refresh colors, using the name tokenization looks up.\n this.raw.setTheme({ ...textmate, name: themeName });\n this.loadedThemes.set(themeName, theme);\n }\n return theme;\n }\n\n codeToTokens(code: string, options: CodeToTokensOptions): TokensResult {\n return this.raw.codeToTokens(code, this.resolveOptions(options));\n }\n\n createEditorTokenizer(\n options: DiffsEditorTokenizerOptions\n ): ShikiEditorTokenizer {\n return new ShikiEditorTokenizer(this.raw, options, this);\n }\n\n createStreamTokenizer(options: CodeToTokensOptions): DiffsStreamTokenizer {\n return new ShikiStreamTokenizer(this.raw, this.resolveOptions(options));\n }\n\n async loadLanguages(languages: readonly string[]): Promise<void> {\n this.assertNotDisposed();\n const missing = languages.filter(\n (language) => !this.attachedLanguages.has(language)\n );\n attachResolvedLanguages(await resolveLanguages(missing), this);\n }\n\n hasLoadedLanguages(languages: readonly string[]): boolean {\n if (this.disposed) {\n return false;\n }\n // Custom registrations count only when attached here; bundled grammars\n // loaded on the raw instance by other code are found in Shiki's list.\n let loaded: string[] | undefined;\n return languages.every((lang) => {\n if (this.attachedLanguages.has(lang)) {\n return true;\n }\n if (RegisteredCustomLanguages.has(lang)) {\n return false;\n }\n loaded ??= this.raw.getLoadedLanguages();\n return loaded.includes(lang);\n });\n }\n\n attachLanguages(languages: readonly ResolvedLanguage[]): void {\n this.assertNotDisposed();\n for (const lang of languages) {\n if (this.attachedLanguages.has(lang.name)) {\n continue;\n }\n const grammar = lang.data.find(\n (grammar) =>\n grammar.name === lang.name ||\n grammar.aliases?.includes(lang.name) === true\n );\n if (grammar == null) {\n throw new Error(\n `attachResolvedLanguages: No returned grammar declares \"${lang.name}\" as its name or an alias.`\n );\n }\n this.raw.loadLanguageSync(lang.data);\n // Shiki skips loaded grammars, which can leave new aliases unregistered.\n try {\n this.raw.getLanguage(lang.name);\n } catch {\n throw new Error(\n `attachResolvedLanguages: \"${grammar.name}\" is already loaded without alias \"${lang.name}\". Load the alias first or give the grammar a unique name.`\n );\n }\n this.attachedLanguages.add(lang.name);\n }\n }\n\n protected releaseResources(): void {\n this.loadedThemes.clear();\n this.attachedLanguages.clear();\n this.raw.dispose();\n }\n\n // Attach resolved themes before tokenizing. Omit the unused key because\n // Shiki treats `themes: undefined` as a request for multiple themes.\n private resolveOptions({\n theme,\n themes,\n ...options\n }: CodeToTokensOptions): ShikiCodeToTokensOptions {\n this.assertNotDisposed();\n if (theme != null) {\n this.getTheme(theme);\n return { ...options, theme };\n }\n if (themes == null) {\n throw new Error('A theme or themes option is required');\n }\n for (const name of Object.values(themes)) {\n this.getTheme(name);\n }\n return { ...options, themes };\n }\n}\n"],"mappings":";;;;;AAaA,eAAsB,gBACpB,MAC2B;CAC3B,IACE,OAAO,qBAAqB,cACxB,mBACA,gBAAgB,GAEpB,MAAM,IAAI,MACR,oBAAoB,KAAK,2JAC3B;CAEF,MAAM,UAAU,mBAAmB,IAAI,IAAI;CAC3C,IAAI,WAAW,MAAM,OAAO;CAC5B,MAAM,YAAY,YAAY;EAC5B,IAAI,SAAS,0BAA0B,IAAI,IAAI;EAC/C,IAAI,UAAU,MAAM;GAClB,MAAM,EAAE,qBAAqB,MAAM,OAAO;GAC1C,IAAI,OAAO,UAAU,eAAe,KAAK,kBAAkB,IAAI,GAC7D,SAAS,iBAAiB;EAC9B;EACA,IAAI,UAAU,MACZ,MAAM,IAAI,MACR,qBAAqB,KAAK,2CAC5B;EACF,MAAM,EAAE,SAAS,SAAS,MAAM,OAAO;EACvC,MAAM,eAAe;GAAE,MAAM;GAAM;EAAK;EACxC,IAAI,CAAC,kBAAkB,IAAI,IAAI,GAAG,kBAAkB,IAAI,MAAM,YAAY;EAC1E,OAAO;CACT,EAAA,CAAG;CACH,mBAAmB,IAAI,MAAM,QAAQ;CACrC,IAAI;EACF,OAAO,MAAM;CACf,UAAU;EACR,IAAI,mBAAmB,IAAI,IAAI,MAAM,UACnC,mBAAmB,OAAO,IAAI;CAClC;AACF;;;AC7CA,SAAgB,6BACd,UAC8C;CAC9C,OAAO,kBAAkB,IAAI,QAAQ,KAAK,gBAAgB,QAAQ;AACpE;;;ACJA,eAAsB,iBACpB,WAC6B;CAC7B,MAAM,oBAAwC,CAAC;CAC/C,MAAM,qBAA8D,CAAC;CACrE,KAAK,MAAM,YAAY,WAAW;EAChC,IAAI,aAAa,UAAU,aAAa,QAAQ;EAChD,MAAM,wBACJ,6BAA6B,QAAQ,KAAK,gBAAgB,QAAQ;EACpE,IAAI,UAAU,uBACZ,mBAAmB,KAAK,qBAAqB;OAE7C,kBAAkB,KAAK,qBAAqB;CAEhD;CACA,IAAI,mBAAmB,SAAS,GAC9B,MAAM,QAAQ,IAAI,kBAAkB,CAAC,CAAC,MAAM,uBAAuB;EACjE,KAAK,MAAM,oBAAoB,oBAAoB;GACjD,IAAI,oBAAoB,MACtB,MAAM,IAAI,MAAM,+CAA+C;GAEjE,kBAAkB,KAAK,gBAAgB;EACzC;CACF,CAAC;CAGH,OAAO;AACT;;;ACiFA,SAAgB,SACd,MACA,MACkC;CAClC,IAAI;CACJ,OAAO,SAA6B,GAAG,MAAqB;EAC1D,aAAa,OAAO;EACpB,UAAU,iBAAiB,KAAK,MAAM,MAAM,IAAI,GAAG,IAAI;CACzD;AACF;;;AC1GA,MAAM,sBAAsB;AAC5B,IAAI,kBAAkB;;AAGtB,IAAa,uBAAb,MAAkE;CAwG7C;CAvGnB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,eAAe;CACf,cAA4B,CAAC,OAAO;CACpC,wBAAsC,CAAC;CACvC,6BAA6B;CAC7B,yBAEI,CAAC;CACL,YAAoB;CACpB,aAAsB;CACtB,YAAqB;CACrB,mBAA2B;CAC3B,eAAe,EAAE;CACjB,6BAA6B;CAC7B,0BAA0B;CAC1B;CACA,+BAAuC;CACvC,wBAAmE,CAAC;CACpE,6BAAsC;CAEtC,sBAAsB,SAAS,OAAO,gBAA8B;EAElE,IAAI,KAAK,cACP;EAEF,MAAM,EAAE,eAAe,GAAG,aAAa,aAAa,eAAe,CAAC;EACpE,MAAM,UAAU,KAAK,IACnB,eAAe,WAAW,WAAW,eAAe,YACpD,KAAK,cAAc,SACrB;EACA,IACE,KAAK,YAAY,QACjB,CAAC,sBAAsB,KAAK,cAAc,UAAU,GACpD;GACA,MAAM,KAAK,SAAS,cAAc,CAAC,KAAK,cAAc,UAAU,CAAC;GACjE,IAAI,KAAK,cACP;GAEF,KAAK,WAAW,KAAK,aAAa,YAChC,KAAK,cAAc,UACrB;EACF;EACA,KAAK,mBAAmB;EACxB,KAAK,uBAAuB,OAAO;CACrC,GAAG,GAAG;CAEN,cAAc,EAAE,WAAkC;EAChD,IAAI,OAAO,SAAS,YAAY,SAAS,MACvC;EAEF,MAAM,EAAE,MAAM,aAAa,UAAU;EAKrC,IACE,SAAS,cACT,gBAAgB,KAAK,gBACrB,OAAO,UAAU,YACjB,UAAU,KAAK,kBACf;GACA,IAAI,KAAK,8BAA8B,GACrC,KAAK,oBAAoB,KAAK;QAE9B,KAAK,oBAAoB,KAAK;EAElC;CACF;CAEA,mCACE,WAC2B;EAC3B,IACE,CAAC,KAAK,kBACN,YAAY,KACZ,aAAa,KAAK,cAAc,WAEhC,OAAO;EAET,KAAK,eAAe;EACpB,IAAI,KAAK,YAAY,MACnB,OAAO;EAET,IAAI,KAAK,sBAAsB,eAAe,KAAA,GAAW;GACvD,KAAK,iBAAiB,SAAS;GAC/B,MAAM,QAAQ,KAAK,YAAY,cAAc;GAC7C,MAAM,SAAS,KAAK,gBAAgB,WAAW,KAAK;GACpD,KAAK,YAAY,YAAY,KAAK,OAAO;EAC3C;EACA,OAAO,KAAK,sBAAsB,cAAc;CAClD;CAEA,YACE,aACA,SACA,SAIA;EAJiB,KAAA,UAAA;EAKjB,KAAK,eAAe;EACpB,KAAK,gBAAgB,QAAQ;EAC7B,KAAK,aAAa,QAAQ;EAC1B,KAAK,YAAY,CAAC;EAElB,KAAK,yBAAyB,QAAQ,yBAAyB;EAC/D,KAAK,mBAAmB,QAAQ;EAChC,KAAK,iBAAiB,QAAQ,kBAAkB;EAChD,KAAK,SAAS,QAAQ,WAAW;EACjC,KAAK,eAAe;EACpB,KAAK,mBAAmB;CAC1B;CAEA,SAAS,WAAyB;EAChC,IAAI,KAAK,eAAe,WAAW;EACnC,KAAK,aAAa;EAClB,KAAK,mBAAmB;EACxB,KAAK,uBAAuB;EAC5B,KAAK,cAAc,CAAC,OAAO;EAC3B,KAAK,wBAAwB,CAAC;EAC9B,KAAK,6BAA6B;EAClC,KAAK,yBAAyB,CAAC;EAC/B,IAAI,KAAK,YAAY,QAAQ,KAAK,cAAc,YAAY,GAC1D,KAAK,4BAA4B,CAAC;CAEtC;CAIA,qBAA2B;EACzB,IAAI,KAAK,eAAe,IACtB;EAGF,KAAK,SAAS,SAAS,KAAK,UAAU;EACtC,MAAM,EAAE,aAAa,KAAK,aAAa,SAAS,KAAK,UAAU;EAC/D,KAAK,YAAY;CACnB;CAEA,UAAgB;EACd,KAAK,eAAe;EACpB,KAAK,uBAAuB;EAC5B,KAAK,uBAAuB;CAC9B;CAGA,SACE,QACA,aACA,mBAAmB,OACmB;EACtC,KAAK,eAAe;EACpB,KAAK,mBAAmB;EACxB,IACE,KAAK,YAAY,QACjB,CAAC,sBAAsB,KAAK,cAAc,UAAU,GAEpD,MAAM,IAAI,MACR,yBAAyB,KAAK,cAAc,WAAW,aACzD;EAGF,MAAM,EAAE,cAAc,KAAK;EAC3B,MAAM,EAAE,eAAe,GAAG,aAAa,aAAa,eAAe,CAAC;EACpE,MAAM,qBACJ,eAAe,WACX,YACA,KAAK,IAAI,eAAe,YAAY,SAAS;EAEnD,MAAM,aAAa,OAAO;EAC1B,MAAM,YAAY,KAAK,IAAI,cAAc,UAAU;EACnD,MAAM,wBACJ,eAAe,QACf,eAAe,YACf,OAAO,YAAY,KACnB,aAAa,sBACb,OAAO,WAAW;EACpB,MAAM,uBACJ,OAAO,cAAc,MACpB,OAAO,oBAAoB,OAAO,KAAK,eAAe,cAAc,CAAC,KACpE;EACJ,IAAI,KAAK,kBAAkB,CAAC,sBAE1B,KAAK,sBAAsB,SAAS,KAAK,IACvC,KAAK,sBAAsB,QAC3B,OAAO,SACT;EAEF,MAAM,wBACJ,oBAAoB,OAAO,cAAc,KAAK,cAAc;EAC9D,MAAM,0BACJ,wBAAwB,eAAe,QAAQ,cAAc;EAC/D,MAAM,oBACJ,OAAO,qBAAqB,CAAC,CAAC,YAAY,OAAO,OAAO,CAAC;EAC3D,KAAK,wBAAwB,CAAC;EAC9B,KAAK,6BAA6B;EAClC,KAAK,yBAAyB,CAAC;EAC/B,IAAI,mBAAmB;EACvB,IAAI,aAAa,WACV;QAAA,MAAM,CAAC,YAAY,aAAa,mBACnC,IAAI,aAAa,WACf,mBAAmB,KAAK,IACtB,kBACA,KAAK,IAAI,UAAU,YAAY,CAAC,CAClC;EAAA;EAIN,MAAM,4BACJ,oBAAoB,eACnB,wBAAwB,OAAO,YAAY;EAC9C,IAAI,sBACF,KAAK,iBAAiB,UAAU;OAC3B;GACL,KAAK,2BAA2B,MAAM;GACtC,IAAI,eAAe,QAAQ,cAAc,WACvC,KAAK,iBAAiB,SAAS;EAEnC;EAEA,IAAI,oBAAoB;EACxB,IAAI,yBAAyB,kBAAkB,kBAAkB,CAAC;EAClE,IAAI;EACJ,IAAI,8BAA8B;EAClC,IAAI,OAAO,uBACP,kBAAkB,kBAAkB,CAAC,KACrC;EACJ,IAAI,UAAU;EACd,MAAM,6BAAmD,IAAI,IAAI;EACjE,MAAM,sBAEU,4CAA4B,IAAI,IAAI,IAAI,KAAA;EACxD,IAAI,uBAAuB,QAAQ,CAAC,sBAAsB;GACxD,MAAM,eAAe,KAAK,IACxB,mBAAmB,GACnB,WACA,kBACF;GACA,IAAI,eAAe,YAAY;IAC7B,KAAK,iBAAiB,YAAY;IAClC,IAAI,gBAAgB;IACpB,IAAI,iBAAiB,KAAK,YAAY,kBAAkB;IACxD,OAAO,gBAAgB,cAAc,iBAAiB;KACpD,MAAM,WAAW,KAAK,gBAAgB,eAAe,cAAc;KACnE,iBAAiB,SAAS;KAC1B,oBAAoB,IAAI,eAAe,SAAS,cAAc;IAChE;IACA,KAAK,YAAY,gBAAgB;GACnC;EACF;EAGA,IAAI,QAAQ,KAAK,YAAY,SAAS;EACtC,OAAO,OAAO,qBAAsB;GAClC,MAAM,oBAAoB,uBACtB,KAAK,YAAY,OAAO,KACxB,wBACE,KAAK,qBAAqB,OAAO,CAAC,IAClC,KAAA;GACN,IAAI,yBACF,KAAK,YAAY,QAAQ;GAG3B,MAAM,EAAE,gBAAgB,OAAO,cAAc,KAAK,gBAChD,MACA,KACF;GACA,QAAQ;GAER,IAAI,QAAQ,WACV,WAAW,IAAI,MAAM,cAAc;QAEnC,qBAAqB,IAAI,MAAM,cAAc;GAG/C,IAAI,yBACF,KAAK,YAAY,OAAO,KAAK;GAE/B,UACE,QAAQ,2BACP,wBAAwB,0BACzB,qBAAqB,QACrB,MAAM,OAAO,iBAAiB;GAChC,IAAI,SAAS;IACX;IACA,MAAM,YAAY,kBAAkB;IACpC,IAAI,aAAa,MACf;IAEF,IAAI,UAAU,MAAM,oBAAoB;KACtC,sBAAsB,UAAU;KAChC,8BAA8B;KAC9B;IACF;IACA,IAAI,YAAoC,KAAK,YAAY,UAAU;IACnE,IAAI,uBACF,KACE,IAAI,YAAY,OAAO,GACvB,aAAa,UAAU,IACvB,aACA;KACA,YAAY,KAAK,qBAAqB,SAAS;KAC/C,IAAI,aAAa,MACf;KAEF,KAAK,YAAY,aAAa;IAChC;IAEF,IAAI,aAAa,MAAM;KACrB,yBAAyB,UAAU;KACnC;IACF,OAAO;KACL,OAAO,UAAU;KACjB,QAAQ;KACR,yBAAyB,UAAU;IACrC;IACA,UAAU;IACV;GACF;GACA;EACF;EAEA,IAAI,yBAAyB;GAC3B,IAAI,OAAO,oBACT,KAAK,YAAY,OAAO,KAAK;QAE7B,KAAK,YAAY,QAAQ;EAE7B;EAEA,IAAI,WAAW,yBAAyB,uBAAuB,MAAM;GACnE,KAAK,IAAI,YAAY,OAAO,GAAG,aAAa,WAAW,aAAa;IAClE,MAAM,gBAAgB,KAAK,qBAAqB,SAAS;IACzD,IAAI,iBAAiB,MACnB;IAEF,KAAK,YAAY,aAAa;GAChC;GACA,KAAK,wBAAwB,CAAC;GAC9B,KAAK,6BAA6B;GAClC,KAAK,yBAAyB,CAAC;EACjC;EAEA,IAAI,uBAAuB,QAAQ,oBAAoB,OAAO,GAC5D,KAAK,iBAAiB,mBAAmB;EAG3C,IAAI,uBAAuB,MAAM;GAC/B,IAAI,KAAK,kBAAkB,sBACzB,KAAK,sBAAsB,SAAS,KAAK,IACvC,KAAK,sBAAsB,QAC3B,mBACF;GAEF,KAAK,4BACH,qBACA,mBACA,2BACF;EACF,OAAO,IAAI,CAAC,WAAW,OAAO,WAAW;GACvC,MAAM,iBACJ,yBAAyB,cAAc,YACnC,qBACA,aAAa,aAAa,CAAC,uBACzB,aACA;GACR,IAAI,KAAK,kBAAkB,sBACzB,KAAK,sBAAsB,SAAS,KAAK,IACvC,KAAK,sBAAsB,QAC3B,cACF;GAEF,KAAK,4BACH,gBACA,mBACA,iBACF;EACF;EAEA,OAAO;CACT;CAEA,mBAAmB,aAAiC;EAClD,KAAK,eAAe;EACpB,KAAK,oBAAoB,WAAW;CACtC;CAEA,yBAA+B;EAC7B,KAAK,0BAA0B;EAC/B,IAAI,KAAK,YACP;EAEF,KAAK,aAAa;EAClB,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,KAAK,6BAA6B;EAClC,KAAK,+BAA+B,KAAA;EACpC,KAAK,+BAA+B;EACpC,KAAK,wBAAwB,CAAC;EAC9B,KAAK,6BAA6B;EAClC,KAAK,yBAAyB,CAAC;EAC/B,KAAK,uBAAuB;CAC9B;CAEA,0BAAgC;EAC9B,IAAI,KAAK,cAAc,KAAK,WAC1B;EAEF,IAAI,KAAK,QACP,QAAQ,IAAI,iDAAiD,EAC3D,OAAO,KAAK,iBACd,CAAC;EAEH,KAAK,YAAY;CACnB;CAEA,2BAAiC;EAC/B,IACE,KAAK,cACL,CAAC,KAAK,aACN,KAAK,YAAY,QACjB,KAAK,YAAY,GAEjB;EAEF,IAAI,KAAK,QACP,QAAQ,IAAI,kDAAkD,EAC5D,OAAO,KAAK,iBACd,CAAC;EAEH,KAAK,YAAY;EACjB,KAAK,qBAAqB,KAAK,gBAAgB;CACjD;CAEA,iBAAuB;EACrB,IACE,KAAK,YAAY,QACjB,CAAC,sBAAsB,KAAK,cAAc,UAAU,KACpD,KAAK,aACF,mBAAmB,CAAC,CACpB,SAAS,KAAK,cAAc,UAAU,GAEzC,KAAK,WAAW,KAAK,aAAa,YAChC,KAAK,cAAc,UACrB;CAEJ;CAEA,yBAA+B;EAC7B,IAAI,KAAK,4BACP;EAEF,WAAW,iBAAiB,WAAW,KAAK,UAAU;EACtD,KAAK,6BAA6B;CACpC;CAEA,yBAA+B;EAC7B,IAAI,CAAC,KAAK,4BACR;EAEF,WAAW,oBAAoB,WAAW,KAAK,UAAU;EACzD,KAAK,6BAA6B;CACpC;CAEA,qBAAqB,OAAqB;EAExC,WAAW,YAAY;GACrB,MAAM;GACN,aAAa,KAAK;GAClB;EACF,CAAC;CACH;CAEA,4BACE,WACA,mBACA,oBAAoB,GACd;EACN,IAAI,sBAAsB,KAAK,cAAc,UAAU,GACrD;EAGF,MAAM,QAAQ,EAAE,KAAK;EAErB,IAAI,KAAK,QACP,QAAQ,IAAI,oDAAoD;GAC9D;GACA;GACA;GACA;EACF,CAAC;EAGH,KAAK,aAAa;EAClB,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,IAAI,KAAK,8BAA8B,GACrC,KAAK,0BAA0B,KAAK,IAClC,KAAK,yBACL,KAAK,0BACP;EAEF,KAAK,6BAA6B;EAClC,KAAK,+BAA+B;EACpC,KAAK,+BAA+B;EACpC,KAAK,uBAAuB;EAC5B,KAAK,qBAAqB,KAAK;CACjC;CAEA,uBAAuB,SAAuB;EAC5C,IAAI,KAAK,YAAY,QAAQ,KAAK,YAAY,SAAS,SACrD;EAIF,IAAI,CAAC,KAAK,YAAY;GACpB,IAAI,KAAK,8BAA8B,GACrC,KAAK,6BAA6B,KAAK,IACrC,KAAK,4BACL,OACF;QAEA,KAAK,0BAA0B,KAAK,IAClC,KAAK,yBACL,OACF;GAEF;EACF;EAEA,MAAM,QAAQ,EAAE,KAAK;EACrB,KAAK,aAAa;EAClB,KAAK,YAAY;EACjB,KAAK,YAAY,KAAK,YAAY,SAAS;EAC3C,KAAK,6BAA6B;EAClC,KAAK,0BAA0B;EAC/B,KAAK,+BAA+B,KAAA;EACpC,KAAK,+BAA+B;EACpC,KAAK,uBAAuB;EAC5B,KAAK,qBAAqB,KAAK;CACjC;CAEA,gBACE,MACA,OACgE;EAChE,MAAM,WAAW,KAAK,cAAc,YAAY,IAAI;EACpD,IAAI,SAAS,UAAU,KAAK,wBAAwB;GAClD,QAAQ,KACN,gBAAgB,KAAK,0BAA0B,SAAS,QAC1D;GACA,KAAK,2BAA2B,MAAM,IAAI;GAC1C,OAAO;IAAE,gBAAgB,CAAC;KAAC;KAAG;KAAI;IAAQ,CAAC;IAAG;GAAM;EACtD;EACA,IAAI,KAAK,YAAY,QAAQ,aAAa,MAAM,SAAS,KAAK,MAAM,IAAI;GACtE,KAAK,2BAA2B,MAAM,IAAI;GAC1C,OAAO;IAAE,gBAAgB,CAAC;KAAC;KAAG;KAAI;IAAQ,CAAC;IAAG;GAAM;EACtD;EACA,MAAM,SAAS,aACb,KAAK,UACL,KAAK,WACL,UACA,OACA,qBACA,KAAK,cACP;EACA,KAAK,2BAA2B,MAAM,OAAO,oBAAoB;EACjE,OAAO;GACL,gBAAgB,OAAO;GACvB,OAAO,OAAO;EAChB;CACF;CAEA,2BACE,MACA,QACM;EACN,IAAI,KAAK,gBACP,KAAK,sBAAsB,QAAQ;CAEvC;CAIA,2BAA2B,QAAkC;EAC3D,MAAM,cACJ,OAAO,sBACN,CAAC;GAAC,OAAO;GAAW,OAAO;GAAS,OAAO;EAAS,CAAC;EACxD,MAAM,kBAAkB,OAAO,YAAY;EAE3C,IAAI,mBADqB,KAAK,YAAY,SAAS,iBACV;GACvC,KAAK,wBAAwB,KAAK;GAClC,KAAK,6BAA6B;GAClC,KAAK,cAAc,KAAK,YAAY,MAAM,GAAG,eAAe;EAC9D,OAAO;GACL,KAAK,6BAA6B;GAClC,KAAK,wBAAwB,KAAK,YAAY,MAAM,eAAe;GACnE,KAAK,YAAY,SAAS,KAAK,IAC7B,KAAK,YAAY,QACjB,eACF;EACF;EACA,KAAK,yBAAyB;CAChC;CAEA,qBAAqB,MAAsC;EACzD,IAAI,eAAe;EACnB,KACE,IAAI,QAAQ,KAAK,uBAAuB,SAAS,GACjD,SAAS,GACT,SACA;GACA,MAAM,CAAC,WAAW,SAAS,aACzB,KAAK,uBAAuB;GAC9B,IAAI,cAAc,GAChB;GAEF,IAAI,eAAe,SACjB,gBAAgB;QACX,IAAI,eAAe,WACxB,OAAO,KAAK,YAAY;EAE5B;EACA,OACE,KAAK,sBACH,eAAe,KAAK,+BACjB,KAAK,YAAY;CAE1B;CAEA,iBAAiB,OAAe,YAA8B;EAC5D,MAAM,eAAe,KAAK,IACxB,KAAK,IAAI,GAAG,KAAK,GACjB,KAAK,cAAc,SACrB;EACA,IAAI,KAAK,YAAY,SAAS,gBAAgB,KAAK,YAAY,MAC7D,OAAO;EAET,MAAM,YAAY,cAAc,OAAO,IAAI,YAAY,IAAI;EAC3D,IAAI,OAAO,KAAK,YAAY,SAAS;EACrC,IAAI,QAAQ,KAAK,YAAY,SAAS;EACtC,OAAO,OAAO,cAAc;GAC1B,KAAK,YAAY,QAAQ;GACzB,MAAM,WAAW,KAAK,cAAc,YAAY,IAAI;GACpD,IACE,SAAS,SAAS,KAAK,0BACvB,aAAa,MACb,SAAS,KAAK,MAAM,IACpB;IACA,MAAM,SAAS,aACb,KAAK,UACL,KAAK,WACL,UACA,OACA,qBACA,KAAK,gBACL,KACF;IACA,KAAK,2BAA2B,MAAM,OAAO,oBAAoB;IACjE,QAAQ,OAAO;GACjB,OACE,KAAK,2BAA2B,MAAM,IAAI;GAE5C;GACA,KAAK,YAAY,QAAQ;GACzB,IAAI,cAAc,QAAQ,YAAY,IAAI,IAAI,YAAY,YACxD;EAEJ;EACA,OAAO,QAAQ;CACjB;CAEA,oBAAoB,OAAqB;EACvC,IACE,KAAK,cACL,KAAK,aACL,KAAK,YAAY,QACjB,UAAU,KAAK,kBAEf;EAGF,KAAK,mBAAmB;EAGxB,MAAM,WAAW,KAAK,iBAAiB,KAAK,4BAA4B,CAAC;EACzE,IAAI,KAAK,cAAc,KAAK,aAAa,UAAU,KAAK,kBACtD;EAEF,IAAI,UAAU;GACZ,KAAK,uBAAuB;GAC5B;EACF;EACA,KAAK,YAAY,KAAK,YAAY,SAAS;EAC3C,KAAK,qBAAqB,KAAK;CACjC;CAEA,oBAAoB,OAAe;EACjC,IACE,KAAK,cACL,KAAK,aACL,KAAK,YAAY,QACjB,UAAU,KAAK,kBAEf;EAGF,KAAK,mBAAmB;EAExB,MAAM,IAAI,YAAY,IAAI;EAC1B,MAAM,wBAAQ,IAAI,IAAqC;EACvD,MAAM,aAAa,KAAK,cAAc;EACtC,MAAM,oBAAoB,KAAK;EAE/B,IAAI,OAAO,KAAK;EAChB,IAAI,QAAQ,KAAK,YAAY,SAAS;EACtC,IAAI,UAAU;EACd,IAAI,oBAAoB,KAAK;EAC7B,IAAI,yBAAyB,oBAAoB,kBAAkB,GAAG;EACtE,OAAO,OAAO,aAAc;GAC1B,KAAK,YAAY,QAAQ;GAEzB,MAAM,oBACJ,0BAA0B,OACtB,KAAK,qBAAqB,OAAO,CAAC,IAClC,KAAA;GACN,MAAM,SAAS,KAAK,gBAAgB,MAAM,KAAK;GAC/C,MAAM,IAAI,MAAM,OAAO,cAAc;GACrC,QAAQ,OAAO;GAEf,KAAK,YAAY,OAAO,KAAK;GAC7B,UACE,0BAA0B,QAC1B,QAAQ,0BACR,qBAAqB,QACrB,MAAM,OAAO,iBAAiB;GAChC;GACA,IAAI,SAAS;IACX;IACA,MAAM,YAAY,oBAAoB;IACtC,IAAI,aAAa,MACf;IAEF,yBAAyB,UAAU;IACnC,IAAI,KAAK,YAAY,UAAU,OAAO,MACpC,UAAU;SACL;KACL,OAAO,UAAU;KACjB,QAAQ,KAAK,YAAY,SAAS;KAClC,UAAU;KACV;IACF;GACF;GAGA,IAAI,YAAY,IAAI,IAAI,IAAI,GAC1B;EAEJ;EAEA,KAAK,iBAAiB,KAAK;EAC3B,IAAI,KAAK,cAAc,KAAK,aAAa,UAAU,KAAK,kBACtD;EAGF,IAAI,WAAW,QAAQ,YAAY;GACjC,MAAM,yBAAyB,KAAK;GACpC,KAAK,uBAAuB;GAC5B,IAAI,0BAA0B,GAC5B,KAAK,uBAAuB,sBAAsB;GAEpD;EACF;EAEA,KAAK,YAAY;EACjB,KAAK,+BAA+B;EACpC,KAAK,qBAAqB,KAAK;CACjC;AACF;AAEA,SAAS,aACP,SACA,UACA,UACA,YACA,WACA,8BAA8B,MAC9B,gBAAgB,MAKhB;CACA,MAAM,SAAS,QAAQ,cAAc,UAAU,YAAY,SAAS;CACpE,IAAI,OAAO,cACT,QAAQ,KACN,oDAAoD,SAAS,UAAU,GAAG,GAAG,GAC/E;CAEF,MAAM,YAAY,OAAO;CACzB,MAAM,eAAe,UAAU,SAAS;CACxC,MAAM,iBAA0C,CAAC;CACjD,MAAM,uBAA2C,CAAC;CAClD,IAAI,CAAC,iBAAiB,CAAC,6BACrB,OAAO;EACL,WAAW,OAAO;EAClB;EACA;CACF;CAEF,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,KAAK;EACrC,MAAM,SAAS,UAAU,IAAI;EAC7B,MAAM,aACJ,IAAI,IAAI,eAAe,UAAU,IAAI,IAAI,KAAK,SAAS;EACzD,IAAI,WAAW,YAEb;EAEF,MAAM,WAAW,UAAU,IAAI,IAAI;EACnC,IAAI,eAAe;GACjB,MAAM,KAAK,qBAAqB,cAAc,QAAQ;GACtD,eAAe,KAAK;IAClB;IACA,SAAS;IACT,SAAS,MAAM,QAAQ,UAAU;GACnC,CAAC;EACH;EACA,IACE,+BACA,qBAAqB,aAAa,QAAQ,IAAI,GAE9C,qBAAqB,KAAK,CAAC,QAAQ,UAAU,CAAC;CAElD;CACA,OAAO;EACL,WAAW,OAAO;EAClB;EACA;CACF;AACF;AAGA,SAAS,sBAAsB,YAA6B;CAC1D,OAAO,eAAe,UAAU,eAAe;AACjD;;;AC/1BA,IAAa,uBAAb,MAAa,6BAA6B,oBAAoB;CAMzC;CACA;CALnB,QAAQ;CACR;CAEA,YACE,aACA,SACA;EACA,MAAM;EAHW,KAAA,cAAA;EACA,KAAA,UAAA;CAGnB;CAEA,cACE,OACA,QACiD;EACjD,MAAM,cAAc,KAAK,QAAQ,MAAA,CAAO,MAAM,cAAc;EAC5D,IAAI,WAA0B,CAAC;EAC/B,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK,GAAG;GAC7C,MAAM,OAAO,WAAW;GACxB,MAAM,SAAS,KAAK,YAAY,aAAa,MAAM;IACjD,GAAG,KAAK;IACR,cAAc,KAAK;GACrB,CAAC;GACD,MAAM,SAAS,OAAO,OAAO,EAAE,CAAC,KAAK,WAAW;IAC9C,GAAG;IACH,QAAQ,MAAM,SAAS,KAAK;GAC9B,EAAE;GACF,IAAI,IAAI,IAAI,WAAW,QAAQ;IAC7B,YAAY,QAAQ,MAAM;IAC1B,KAAK,cAAc,QAAQ,KAAK,QAAQ,WAAW,IAAI,EAAE;IACzD,KAAK,gBAAgB,OAAO;GAC9B,OAAO;IACL,WAAW;IACX,KAAK,QAAQ;GACf;EACF;EACA,OAAO;GAAE;GAAU,YAAY,KAAK,MAAM;EAAO;CACnD;CAEA,QAA8B;EAC5B,KAAK,aAAa;EAClB,MAAM,QAAQ,IAAI,qBAAqB,KAAK,aAAa,KAAK,OAAO;EACrE,KAAK,YAAY,KAAK;EACtB,MAAM,QAAQ,KAAK;EACnB,MAAM,gBAAgB,KAAK;EAC3B,OAAO;CACT;CAEA,cAA8B;EAC5B,KAAK,QAAQ;EACb,KAAK,gBAAgB,KAAA;CACvB;CAEA,gBAAgC;EAC9B,KAAK,YAAY;CACnB;AACF;;;AC3CA,IAAa,mBAAb,MAAa,yBAAyB,iBAAiB;CAsBlC;CAnBnB,+BAAgC,IAAI,IAAwB;CAE5D,oCAAqC,IAAI,IAAI,CAAC,QAAQ,MAAM,CAAC;CAE7D,aAAa,OAAO,MAAwD;EAC1E,MAAM,SACJ,SAAS,gBACJ,MAAM,OAAO,0BAAA,CAA2B,sBACvC,OAAO,aACT,KAEE,MAAM,OAAO,2BAAA,CACb,4BAA4B;EACpC,MAAM,MAAM,MAAM,sBAAsB;GAAE,QAAQ,CAAC;GAAG,OAAO,CAAC;GAAG;EAAO,CAAC;EACzE,OAAO,IAAI,iBAAiB,MAAM,GAAG;CACvC;CAEA,YACE,MACA,KACA;EACA,MAAM,MAAM,yBAAyB,IAAI,CAAC;EAFzB,KAAA,MAAA;CAGnB;CAEA,SAAS,WAA+B;EACtC,KAAK,kBAAkB;EACvB,MAAM,SAAS,KAAK,aAAa,IAAI,SAAS;EAC9C,MAAM,QAAQ,KAAK,cAAc,iBAAiB,SAAS,KAAK;EAChE,IAAI,SAAS,MACX,MAAM,IAAI,MAAM,UAAU,UAAU,wBAAwB;EAE9D,IAAI,WAAW,OAAO;GACpB,MAAM,WACJ,MAAM,aACL,MAAM,gBAAgB,OACnB,wBAAwB,MAAM,YAAY,IAC1C,KAAA;GACN,IAAI,YAAY,MACd,MAAM,IAAI,MAAM,UAAU,UAAU,yBAAyB;GAG/D,KAAK,IAAI,SAAS;IAAE,GAAG;IAAU,MAAM;GAAU,CAAC;GAClD,KAAK,aAAa,IAAI,WAAW,KAAK;EACxC;EACA,OAAO;CACT;CAEA,aAAa,MAAc,SAA4C;EACrE,OAAO,KAAK,IAAI,aAAa,MAAM,KAAK,eAAe,OAAO,CAAC;CACjE;CAEA,sBACE,SACsB;EACtB,OAAO,IAAI,qBAAqB,KAAK,KAAK,SAAS,IAAI;CACzD;CAEA,sBAAsB,SAAoD;EACxE,OAAO,IAAI,qBAAqB,KAAK,KAAK,KAAK,eAAe,OAAO,CAAC;CACxE;CAEA,MAAM,cAAc,WAA6C;EAC/D,KAAK,kBAAkB;EACvB,MAAM,UAAU,UAAU,QACvB,aAAa,CAAC,KAAK,kBAAkB,IAAI,QAAQ,CACpD;EACA,wBAAwB,MAAM,iBAAiB,OAAO,GAAG,IAAI;CAC/D;CAEA,mBAAmB,WAAuC;EACxD,IAAI,KAAK,UACP,OAAO;EAIT,IAAI;EACJ,OAAO,UAAU,OAAO,SAAS;GAC/B,IAAI,KAAK,kBAAkB,IAAI,IAAI,GACjC,OAAO;GAET,IAAI,0BAA0B,IAAI,IAAI,GACpC,OAAO;GAET,WAAW,KAAK,IAAI,mBAAmB;GACvC,OAAO,OAAO,SAAS,IAAI;EAC7B,CAAC;CACH;CAEA,gBAAgB,WAA8C;EAC5D,KAAK,kBAAkB;EACvB,KAAK,MAAM,QAAQ,WAAW;GAC5B,IAAI,KAAK,kBAAkB,IAAI,KAAK,IAAI,GACtC;GAEF,MAAM,UAAU,KAAK,KAAK,MACvB,YACC,QAAQ,SAAS,KAAK,QACtB,QAAQ,SAAS,SAAS,KAAK,IAAI,MAAM,IAC7C;GACA,IAAI,WAAW,MACb,MAAM,IAAI,MACR,0DAA0D,KAAK,KAAK,2BACtE;GAEF,KAAK,IAAI,iBAAiB,KAAK,IAAI;GAEnC,IAAI;IACF,KAAK,IAAI,YAAY,KAAK,IAAI;GAChC,QAAQ;IACN,MAAM,IAAI,MACR,6BAA6B,QAAQ,KAAK,qCAAqC,KAAK,KAAK,2DAC3F;GACF;GACA,KAAK,kBAAkB,IAAI,KAAK,IAAI;EACtC;CACF;CAEA,mBAAmC;EACjC,KAAK,aAAa,MAAM;EACxB,KAAK,kBAAkB,MAAM;EAC7B,KAAK,IAAI,QAAQ;CACnB;CAIA,eAAuB,EACrB,OACA,QACA,GAAG,WAC6C;EAChD,KAAK,kBAAkB;EACvB,IAAI,SAAS,MAAM;GACjB,KAAK,SAAS,KAAK;GACnB,OAAO;IAAE,GAAG;IAAS;GAAM;EAC7B;EACA,IAAI,UAAU,MACZ,MAAM,IAAI,MAAM,sCAAsC;EAExD,KAAK,MAAM,QAAQ,OAAO,OAAO,MAAM,GACrC,KAAK,SAAS,IAAI;EAEpB,OAAO;GAAE,GAAG;GAAS;EAAO;CAC9B;AACF"}
|
|
@@ -210,8 +210,8 @@ const CHARACTER_REFERENCES = {
|
|
|
210
210
|
};
|
|
211
211
|
const MAX_CACHED_STYLES = 256;
|
|
212
212
|
/**
|
|
213
|
-
*
|
|
214
|
-
*
|
|
213
|
+
* Serializes a HAST node or node array to HTML. Common token spans use a fast
|
|
214
|
+
* path; other nodes and attributes use hast-util-to-html's default serialization.
|
|
215
215
|
*/
|
|
216
216
|
function hastToHtml(tree) {
|
|
217
217
|
const styles = /* @__PURE__ */ new Map();
|
|
@@ -280,8 +280,11 @@ function toCharacterReference(character) {
|
|
|
280
280
|
}
|
|
281
281
|
//#endregion
|
|
282
282
|
//#region src/utils/tokensToHtml.ts
|
|
283
|
-
/**
|
|
284
|
-
|
|
283
|
+
/**
|
|
284
|
+
* Renders existing tokens as a pre/code HTML block without highlighting again.
|
|
285
|
+
* Pass the original source to resolve numeric decoration offsets.
|
|
286
|
+
*/
|
|
287
|
+
function tokensToHtml(source, result, options, cacheHtmlStyles = false) {
|
|
285
288
|
const lineOffsets = [0];
|
|
286
289
|
if (options.decorations?.some((item) => typeof item.start === "number" || typeof item.end === "number") === true) for (let index = source.indexOf("\n"); index !== -1; index = source.indexOf("\n", index + 1)) lineOffsets.push(index + 1);
|
|
287
290
|
const code = {
|
|
@@ -421,4 +424,4 @@ var BaseStreamTokenizer = class {
|
|
|
421
424
|
//#endregion
|
|
422
425
|
export { isWorkerContext as i, DiffsHighlighter as n, createDiffsThemeResolver as r, BaseStreamTokenizer as t };
|
|
423
426
|
|
|
424
|
-
//# sourceMappingURL=stream-tokenizer-
|
|
427
|
+
//# sourceMappingURL=stream-tokenizer-DK9xp5M5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-tokenizer-DK9xp5M5.js","names":[],"sources":["../../src/utils/isWorkerContext.ts","../../src/highlighter/themes/createCachedLoader.ts","../../src/highlighter/themes/themeResolver.ts","../../src/utils/hastToHtml.ts","../../src/utils/tokensToHtml.ts","../../src/highlighter/DiffsHighlighter.ts","../../src/highlighter/stream-tokenizer.ts"],"sourcesContent":["declare const WorkerGlobalScope: new () => Worker;\n\nexport function isWorkerContext(): boolean {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n typeof self !== 'undefined' &&\n self instanceof WorkerGlobalScope\n );\n}\n","export function createCachedLoader<T extends object>(\n loader: () => Promise<T>\n): () => T | Promise<T> {\n let cached: T | Promise<T> | undefined;\n return () =>\n (cached ??= loader().then(\n (loaded) => {\n cached = loaded;\n return loaded;\n },\n (error: unknown) => {\n cached = undefined;\n throw error;\n }\n ));\n}\n","import type {\n Theme as ZedTheme,\n ThemeFamily as ZedThemeFamily,\n} from '@pierre/highlights';\nimport {\n createThemeResolver,\n type ThemeLoader,\n type ThemeResolver,\n} from '@pierre/theming';\nimport type { ThemeRegistration } from 'shiki';\n\nimport type { HighlighterTypes } from '../../types';\nimport { isWorkerContext } from '../../utils/isWorkerContext';\nimport { createCachedLoader } from './createCachedLoader';\nimport type { DiffsTheme } from './types';\n\ndeclare const __DIFFS_WORKER__: boolean | undefined;\n\nexport type CustomThemeLoader = ThemeLoader<\n ThemeRegistration | DiffsTheme | ZedTheme | ZedThemeFamily\n>;\nexport const customThemes: Map<\n string,\n Partial<Record<'textmate' | 'zed' | 'diffs', CustomThemeLoader>>\n> = new Map();\nconst resolvers = new Map<HighlighterTypes, ThemeResolver<DiffsTheme>>();\n\nconst loadHighlightsThemeCatalog = createCachedLoader(\n () => import('@pierre/highlights/themes/loader')\n);\nconst loadPierreThemeCatalog = createCachedLoader(\n () => import('@pierre/theming/themes')\n);\nconst loadShikiCore = createCachedLoader(() => import('shiki/core'));\n\n// Map Zed colors to the VS Code keys used by editor and diff overlays.\nconst ZED_COLOR_ALIASES: readonly (readonly [\n target: string,\n ...sources: string[],\n])[] = [\n ['editor.lineHighlightBackground', 'editor.active_line.background'],\n ['editor.selectionBackground', 'element.selected'],\n ['editor.findMatchBackground', 'search.match_background'],\n ['editor.findMatchHighlightBackground', 'search.match_background'],\n [\n 'editorBracketMatch.background',\n 'editor.document_highlight.bracket_background',\n ],\n ['editorError.foreground', 'error'],\n ['editorWarning.foreground', 'warning'],\n ['editorInfo.foreground', 'info'],\n ['editorHint.foreground', 'hint'],\n ['gitDecoration.addedResourceForeground', 'created', 'terminal.ansi.green'],\n ['gitDecoration.deletedResourceForeground', 'deleted', 'terminal.ansi.red'],\n [\n 'gitDecoration.modifiedResourceForeground',\n 'modified',\n 'terminal.ansi.blue',\n ],\n];\n\nfunction createHighlightsTheme(\n name: string,\n raw: ZedTheme | ZedThemeFamily\n): DiffsTheme {\n const theme = 'themes' in raw ? raw.themes[0] : raw;\n if (theme == null)\n throw new Error(`Theme \"${name}\" is an empty Zed theme family.`);\n const zed = { ...theme, name };\n const colors: Record<string, string> = {};\n for (const [key, value] of Object.entries(zed.style)) {\n if (typeof value === 'string') colors[key] = value;\n }\n // Zed keeps the local user's caret and selection in the first player slot.\n const player = zed.style.players?.[0];\n if (player?.cursor != null)\n colors['editorCursor.foreground'] ??= player.cursor;\n if (player?.selection != null)\n colors['editor.selectionBackground'] ??= player.selection;\n for (const [target, ...sources] of ZED_COLOR_ALIASES) {\n if (colors[target] != null) continue;\n const source = sources.find((key) => colors[key] != null);\n if (source != null) colors[target] = colors[source];\n }\n if (zed.cssVariables === true) {\n colors['editor.foreground'] = 'var(--hls-foreground)';\n colors['editor.background'] = 'var(--hls-background)';\n } else if (typeof zed.cssVariables === 'object') {\n colors['editor.foreground'] ??=\n colors.text ?? colors.foreground ?? 'foreground';\n colors['editor.background'] ??= colors.background ?? 'background';\n const { prefix = '--hls-', defaults } = zed.cssVariables;\n for (const [key, value] of Object.entries(colors)) {\n const fallback = defaults?.[value];\n colors[key] = `var(${prefix}${value}${fallback ? `, ${fallback}` : ''})`;\n }\n }\n const type = zed.appearance === 'light' ? 'light' : 'dark';\n return {\n name,\n type,\n colors,\n zed,\n fg:\n colors['editor.foreground'] ??\n colors.text ??\n colors.foreground ??\n (type === 'light' ? '#333333' : '#bbbbbb'),\n bg:\n colors['editor.background'] ??\n colors.background ??\n (type === 'light' ? '#ffffff' : '#1e1e1e'),\n };\n}\n\n/** Keep caches separate because the same name can have TextMate and Zed palettes. */\nexport function createDiffsThemeResolver(\n backend: HighlighterTypes\n): ThemeResolver<DiffsTheme> {\n let resolver = resolvers.get(backend);\n if (resolver != null) return resolver;\n resolver = createThemeResolver<DiffsTheme>({\n fallbackLoader: async (name) => {\n if (\n typeof __DIFFS_WORKER__ !== 'undefined'\n ? __DIFFS_WORKER__\n : isWorkerContext()\n ) {\n throw new Error(\n `Theme \"${name}\" cannot be resolved from a worker context. Themes must be pre-resolved on the main thread and passed to the worker via the resolvedThemes parameter.`\n );\n }\n const custom = customThemes.get(name);\n if (backend === 'highlights') {\n const loader = custom?.zed ?? custom?.diffs;\n if (loader != null) {\n const loaded = await loader();\n const theme = 'default' in loaded ? loaded.default : loaded;\n if ('zed' in theme && theme.zed != null) return theme;\n if ('style' in theme || 'themes' in theme)\n return createHighlightsTheme(name, theme);\n throw new Error(\n `Theme \"${name}\" is a TextMate theme; register a Zed theme with registerCustomTheme(name, loader, 'zed') for Highlights.`\n );\n }\n const catalog = loadHighlightsThemeCatalog();\n const { themes } = catalog instanceof Promise ? await catalog : catalog;\n const bundledLoader = themes[name];\n if (bundledLoader != null) {\n const loaded = await bundledLoader();\n return createHighlightsTheme(name, loaded.default);\n }\n if (custom?.textmate != null) {\n throw new Error(\n `Theme \"${name}\" is only registered for TextMate; use registerCustomTheme(name, loader, 'zed') for Highlights.`\n );\n }\n } else {\n const loader = custom?.textmate ?? custom?.diffs;\n let loaded: ThemeRegistration | DiffsTheme | ZedTheme | ZedThemeFamily;\n if (loader != null) {\n const result = await loader();\n loaded = 'default' in result ? result.default : result;\n } else {\n const catalog = loadPierreThemeCatalog();\n const { themes } =\n catalog instanceof Promise ? await catalog : catalog;\n const descriptor = themes.getTheme(name);\n if (descriptor == null && custom?.zed != null) {\n throw new Error(\n `Theme \"${name}\" is only registered for Zed; use registerCustomTheme(name, loader, 'textmate') for Shiki.`\n );\n }\n if (descriptor == null)\n throw new Error(`No valid theme loader registered for \"${name}\"`);\n const result = await descriptor.load();\n loaded = 'default' in result ? result.default : result;\n }\n if ('style' in loaded || 'themes' in loaded) {\n throw new Error(\n `Theme \"${name}\" is a Zed theme; use preferredHighlighter: 'highlights' or register a TextMate theme for Shiki.`\n );\n }\n const core = loadShikiCore();\n const { normalizeTheme, createCssVariablesTheme } =\n core instanceof Promise ? await core : core;\n if ('cssVariables' in loaded && loaded.cssVariables != null) {\n return {\n ...loaded,\n textmate: normalizeTheme(\n createCssVariablesTheme(loaded.cssVariables)\n ),\n };\n }\n if ('textmate' in loaded && loaded.textmate != null) {\n return { ...loaded, textmate: normalizeTheme(loaded.textmate) };\n }\n const textmate = normalizeTheme(loaded);\n return {\n name: textmate.name,\n type: textmate.type,\n fg: textmate.fg,\n bg: textmate.bg,\n colors: textmate.colors,\n textmate,\n };\n }\n throw new Error(`No valid theme loader registered for \"${name}\"`);\n },\n normalizeTheme: (theme, name) => {\n if (theme.name !== name)\n throw new Error(\n `resolvedTheme: themeName: ${name} does not match theme.name: ${theme.name}`\n );\n return theme;\n },\n });\n resolvers.set(backend, resolver);\n return resolver;\n}\n","import type { Element, Nodes, Properties, RootContent } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\n// Must match the html-void-elements list used by toHtml().\nconst VOID_ELEMENTS = new Set([\n 'area',\n 'base',\n 'basefont',\n 'bgsound',\n 'br',\n 'col',\n 'command',\n 'embed',\n 'frame',\n 'hr',\n 'image',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n]);\n\n// These elements require schema, fragment or raw-text handling in toHtml().\nconst DELEGATED_TAGS = new Set(['svg', 'template', 'script', 'style']);\n\n// Boolean and comma-separated attributes require the full HTML schema.\nconst ATTRIBUTE_NAMES: Record<string, string | undefined> = {\n class: 'class',\n className: 'class',\n id: 'id',\n role: 'role',\n style: 'style',\n tabIndex: 'tabindex',\n tabindex: 'tabindex',\n title: 'title',\n};\nconst DATA_ATTRIBUTE = /^data-[\\w.:-]+$/;\n\nconst TEXT_ESCAPE = /[<&]/g;\nconst ATTRIBUTE_ESCAPE = /[\\0\"&'`]/g;\n// Must match stringify-entities' default hexadecimal encoding.\nconst CHARACTER_REFERENCES: Record<string, string> = {\n '<': '<',\n '&': '&',\n '\"': '"',\n \"'\": ''',\n '`': '`',\n '\\0': '�',\n};\nconst MAX_CACHED_STYLES = 256;\n\n/**\n * Serializes a HAST node or node array to HTML. Common token spans use a fast\n * path; other nodes and attributes use hast-util-to-html's default serialization.\n */\nexport function hastToHtml(tree: Nodes | RootContent[]): string {\n const styles = new Map<string, string>();\n return Array.isArray(tree)\n ? serializeChildren(tree, styles)\n : serializeNode(tree, styles);\n}\n\nfunction serializeChildren(\n children: readonly RootContent[],\n styles: Map<string, string>\n): string {\n let html = '';\n for (const child of children) {\n html += serializeNode(child, styles);\n }\n return html;\n}\n\nfunction serializeNode(node: Nodes, styles: Map<string, string>): string {\n switch (node.type) {\n case 'text':\n return escapeText(node.value);\n case 'element':\n return serializeElement(node, styles);\n case 'root':\n return serializeChildren(node.children, styles);\n default:\n return toHtml(node);\n }\n}\n\nfunction serializeElement(node: Element, styles: Map<string, string>): string {\n const { tagName } = node;\n if (\n tagName === 'span' &&\n node.children.length === 1 &&\n node.children[0].type === 'text' &&\n typeof node.properties?.style === 'string'\n ) {\n let styleOnly = true;\n for (const key in node.properties) {\n if (key !== 'style' && node.properties[key] != null) {\n styleOnly = false;\n break;\n }\n }\n if (styleOnly) {\n return `<span ${serializeStyle(node.properties.style, styles)}>${escapeText(node.children[0].value)}</span>`;\n }\n }\n if (DELEGATED_TAGS.has(tagName)) {\n return toHtml(node);\n }\n const attributes = serializeAttributes(node.properties, styles);\n if (attributes == null) {\n return toHtml(node);\n }\n const open =\n attributes === '' ? `<${tagName}>` : `<${tagName} ${attributes}>`;\n const content = serializeChildren(node.children, styles);\n if (content === '' && VOID_ELEMENTS.has(tagName.toLowerCase())) {\n return open;\n }\n return `${open}${content}</${tagName}>`;\n}\n\n// Cap the per-render cache because custom styles may be unique per token.\nfunction serializeStyle(value: string, styles: Map<string, string>): string {\n let attribute = styles.get(value);\n if (attribute == null) {\n attribute = `style=\"${escapeAttribute(value)}\"`;\n if (styles.size < MAX_CACHED_STYLES) styles.set(value, attribute);\n }\n return attribute;\n}\n\n// Returns undefined when a property needs the HTML schema to serialize.\nfunction serializeAttributes(\n properties: Properties | undefined,\n styles: Map<string, string>\n): string | undefined {\n let attributes = '';\n for (const key in properties) {\n const value = properties[key];\n if (value == null) {\n continue;\n }\n const name =\n ATTRIBUTE_NAMES[key] ?? (DATA_ATTRIBUTE.test(key) ? key : undefined);\n if (name == null) {\n return undefined;\n }\n if (value === false || (typeof value === 'number' && Number.isNaN(value))) {\n continue;\n }\n const attribute =\n key === 'style' && typeof value === 'string'\n ? serializeStyle(value, styles)\n : value === true\n ? name\n : `${name}=\"${escapeAttribute(\n Array.isArray(value) ? value.join(' ').trim() : String(value)\n )}\"`;\n attributes += attributes === '' ? attribute : ` ${attribute}`;\n }\n return attributes;\n}\n\nfunction escapeText(value: string): string {\n return value.indexOf('<') < 0 && value.indexOf('&') < 0\n ? value\n : value.replace(TEXT_ESCAPE, toCharacterReference);\n}\n\nfunction escapeAttribute(value: string): string {\n return value.replace(ATTRIBUTE_ESCAPE, toCharacterReference);\n}\n\nfunction toCharacterReference(character: string): string {\n return CHARACTER_REFERENCES[character];\n}\n","import type { Element, Root } from 'hast';\n\nimport type { CodeToHtmlOptions, TokensResult } from '../types';\nimport { hastToHtml } from './hastToHtml';\nimport { renderTokenLines } from './renderTokenLines';\n\n/**\n * Renders existing tokens as a pre/code HTML block without highlighting again.\n * Pass the original source to resolve numeric decoration offsets.\n */\nexport function tokensToHtml(\n source: string,\n result: TokensResult,\n options: CodeToHtmlOptions,\n cacheHtmlStyles: boolean = false\n): string {\n const lineOffsets = [0];\n if (\n options.decorations?.some(\n (item) => typeof item.start === 'number' || typeof item.end === 'number'\n ) === true\n ) {\n for (\n let index = source.indexOf('\\n');\n index !== -1;\n index = source.indexOf('\\n', index + 1)\n )\n lineOffsets.push(index + 1);\n }\n const code: Element = {\n type: 'element',\n tagName: 'code',\n properties: {},\n children: [],\n };\n const lines = renderTokenLines(result.tokens, {\n decorations: options.decorations,\n mergeWhitespaces: options.mergeWhitespaces,\n lineOffsets,\n cacheHtmlStyles,\n });\n for (let i = 0; i < lines.length; i++) {\n if (i > 0) code.children.push({ type: 'text', value: '\\n' });\n code.children.push(lines[i]);\n }\n const root: Root = {\n type: 'root',\n children: [\n {\n type: 'element',\n tagName: 'pre',\n properties: {\n class: 'diffs',\n style:\n result.rootStyle === false\n ? undefined\n : (result.rootStyle ??\n [\n result.fg != null ? `color:${result.fg}` : '',\n result.bg != null ? `background-color:${result.bg}` : '',\n ]\n .filter(Boolean)\n .join(';')),\n tabIndex: 0,\n },\n children: [code],\n },\n ],\n };\n return hastToHtml(root);\n}\n","import type { ThemeResolver } from '@pierre/theming';\n\nimport type { HighlighterTypes } from '../types';\nimport { tokensToHtml } from '../utils/tokensToHtml';\nimport type { ResolvedLanguage } from '../worker/types';\nimport type { DiffsEditorTokenizer } from './DiffsEditorTokenizer';\nimport {\n acquireHighlighterType,\n HighlighterDisposedError,\n releaseHighlighterType,\n} from './highlighterType';\nimport type { DiffsTheme } from './themes/types';\nimport type {\n DiffsEditorTokenizerOptions,\n DiffsStreamTokenizer,\n} from './tokenizer-types';\nimport type {\n CodeToHtmlOptions,\n CodeToTokensOptions,\n TokensResult,\n} from './types';\n\n/**\n * A different highlighter type cannot load in this thread until every\n * instance of the current type is disposed.\n */\nexport abstract class DiffsHighlighter {\n protected disposed = false;\n\n constructor(\n readonly name: HighlighterTypes,\n readonly themeResolver: ThemeResolver<DiffsTheme>\n ) {\n acquireHighlighterType(name);\n }\n\n /**\n * Previously used themes remain available after the shared cache is cleared.\n */\n abstract getTheme(name: string): DiffsTheme;\n\n abstract codeToTokens(\n code: string,\n options: CodeToTokensOptions\n ): TokensResult;\n\n codeToHtml(code: string, options: CodeToHtmlOptions): string {\n return tokensToHtml(\n code,\n this.codeToTokens(code, options),\n options,\n this.name === 'highlights'\n );\n }\n\n abstract createStreamTokenizer(\n options: CodeToTokensOptions\n ): DiffsStreamTokenizer;\n\n abstract createEditorTokenizer(\n options: DiffsEditorTokenizerOptions\n ): DiffsEditorTokenizer;\n\n /** Backends with bundled lexers resolve immediately. */\n abstract loadLanguages(languages: readonly string[]): Promise<void>;\n\n abstract hasLoadedLanguages(languages: readonly string[]): boolean;\n\n /** Attach grammars resolved elsewhere, such as on the main thread for a worker. */\n abstract attachLanguages(languages: readonly ResolvedLanguage[]): void;\n\n get isDisposed(): boolean {\n return this.disposed;\n }\n\n /**\n * Disposed instances cannot be reused.\n */\n dispose(): void {\n if (this.disposed) {\n return;\n }\n this.disposed = true;\n this.releaseResources();\n releaseHighlighterType();\n }\n\n protected abstract releaseResources(): void;\n\n protected assertNotDisposed(): void {\n if (this.disposed) {\n throw new HighlighterDisposedError();\n }\n }\n}\n","import type {\n DiffsStreamTokenizer,\n DiffsStreamTokenizerEnqueueResult,\n} from './tokenizer-types';\nimport type { ThemedToken } from './types';\n\n/**\n * The final line stays provisional until a line break or stream close.\n * A trailing CR waits for the next chunk, which may complete a CRLF pair.\n * Token offsets are absolute UTF-16 positions in the stream.\n */\nexport abstract class BaseStreamTokenizer implements DiffsStreamTokenizer {\n protected disposed = false;\n /** Stream offset of the provisional line's first character. */\n protected stableOffset = 0;\n protected unstable: ThemedToken[] = [];\n protected pendingCarriageReturn = '';\n\n enqueue(chunk: string): DiffsStreamTokenizerEnqueueResult {\n this.assertActive();\n chunk = this.pendingCarriageReturn + chunk;\n this.pendingCarriageReturn = chunk.endsWith('\\r') ? '\\r' : '';\n if (this.pendingCarriageReturn !== '') chunk = chunk.slice(0, -1);\n const recall = this.unstable.length;\n const stable: ThemedToken[] = [];\n const { unstable, tailLength } = this.tokenizeChunk(chunk, stable);\n // Include the pending CR so token contents still reproduce the input.\n if (this.pendingCarriageReturn !== '')\n unstable.push({ content: '\\r', offset: this.stableOffset + tailLength });\n this.unstable = unstable;\n return { recall, stable, unstable };\n }\n\n /**\n * Append completed lines to stable, using pushLineBreak for their endings.\n * Return the unfinished line's tokens and UTF-16 length.\n */\n protected abstract tokenizeChunk(\n chunk: string,\n stable: ThemedToken[]\n ): { unstable: ThemedToken[]; tailLength: number };\n\n /** Emit one token per line-break character and move past the line. */\n protected pushLineBreak(\n stable: ThemedToken[],\n lineLength: number,\n lineBreak: string\n ): void {\n for (let index = 0; index < lineBreak.length; index++) {\n stable.push({\n content: lineBreak[index],\n offset: this.stableOffset + lineLength + index,\n });\n }\n this.stableOffset += lineLength + lineBreak.length;\n }\n\n close(): { stable: ThemedToken[] } {\n const stable = this.unstable;\n this.dispose();\n return { stable };\n }\n\n clear(): void {\n this.assertActive();\n this.stableOffset = 0;\n this.unstable = [];\n this.pendingCarriageReturn = '';\n this.resetSource();\n }\n\n abstract clone(): DiffsStreamTokenizer;\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.unstable = [];\n this.releaseSource();\n }\n\n protected copyStateTo(clone: BaseStreamTokenizer): void {\n clone.stableOffset = this.stableOffset;\n clone.unstable = this.unstable.slice();\n clone.pendingCarriageReturn = this.pendingCarriageReturn;\n }\n\n protected assertActive(): void {\n if (this.disposed) throw new Error('stream tokenizer is disposed');\n }\n\n /** Forget the provisional line and any lexer state. */\n protected abstract resetSource(): void;\n\n protected abstract releaseSource(): void;\n}\n"],"mappings":"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"}
|
package/dist/worker/types.d.ts
CHANGED
|
@@ -124,6 +124,17 @@ interface WorkerPoolOptions {
|
|
|
124
124
|
*/
|
|
125
125
|
onWorkerError?: (event: ErrorEvent | Event, worker: Worker) => void;
|
|
126
126
|
totalASTLRUCacheSize?: number;
|
|
127
|
+
/**
|
|
128
|
+
* Files and diffs with at most this many characters highlight on the main
|
|
129
|
+
* thread instead of a worker. Small highlights finish faster than a worker
|
|
130
|
+
* round trip, so they render highlighted without a plain-text pass. Files
|
|
131
|
+
* count `contents`; diffs count both sides of the diff. Main-thread results
|
|
132
|
+
* share the pool's highlight cache, and priming the cache follows the same
|
|
133
|
+
* rule.
|
|
134
|
+
*
|
|
135
|
+
* When unset, every highlight uses a worker.
|
|
136
|
+
*/
|
|
137
|
+
mainThreadMaxCharacters?: number;
|
|
127
138
|
}
|
|
128
139
|
interface WorkerInitializationRenderOptions extends Partial<WorkerRenderingOptions> {
|
|
129
140
|
langs?: SupportedLanguages[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../../src/worker/types.ts"],"mappings":";;;;KAkBY;UAEK;EACf,OAAO,kBAAkB;EACzB;EACA;EACA,cAAc;EACd;;UAGe;WACN;EACT,mBACE,MAAM,cACN,QAAQ,kBACR,SAAS;EAEX,iBAAiB;;UAGF;WACN;EACT,mBACE,MAAM,kBACN,QAAQ,kBACR,SAAS;EAEX,iBAAiB;;UAGF;EACf;EACA,IAAI;EACJ,MAAM;EACN,oBAAoB;EACpB;EACA,qBAAqB;;UAGN;EACf;EACA,IAAI;EACJ,MAAM;EACN,oBAAoB;EACpB;EACA,qBAAqB;;UAGN;EACf;EACA,IAAI;EACJ,eAAe;EACf,sBAAsB;EACtB,gBAAgB;EAChB,oBAAoB;EACpB;EACA,qBAAqB;;UAGN;EACf,MAAM,QAAQ;EACd,MAAM;;UAGS;EACf;EACA,IAAI;EACJ,eAAe;EACf,gBAAgB;;KAGN,gBACR,KAAK,2BACL,KAAK;KAEG,gBACR,oBACA,oBACA,0BACA;UAEa;EACf;EACA;EACA,IAAI;EACJ,QAAQ;EACR,SAAS;EACT;;UAGe;EACf;EACA;EACA,IAAI;EACJ,QAAQ;EACR,SAAS;EACT;;UAGe;EACf;EACA;EACA,IAAI;EACJ;;UAGe;EACf;EACA;EACA,IAAI;EACJ;;UAGe;EACf;EACA,IAAI;EACJ;EACA;;KAGU,wBACR,4BACA;KAEQ,iBACR,wBACA,sBACA,4BACA;UAEa;;;;;EAKf,qBAAqB;;;;;EAMrB;;;;;EAMA;;;;;;;;;;;;;EAcA,iBAAiB,OAAO,aAAa,OAAO,QAAQ;EAEpD;;UAGe,0CAA0C,QAAQ;EACjE,QAAQ;EACR,uBAAuB;;UAGR;EACf;EACA,IAAI;EACJ,SAAS;EACT,QAAQ;EACR,OAAO,OAAO;EACd;;UAGe;EACf;EACA,IAAI;EACJ,SAAS;EACT,QAAQ;EACR,OAAO,OAAO;EACd;;UAGe;EACf;EACA,OAAO,OAAO;;UAGC;EACf;EACA,IAAI;EACJ,SAAS;;EAET;EACA,WAAW,IAAI;EAGf;EACA;EACA,WAAW,IAAI;EACf;EACA;;UAGe;EACf;EACA,IAAI;EACJ,SAAS;;EAET;EACA,WAAW,IAAI;EAGf;EACA;EACA,WAAW,IAAI;EACf;EACA;;KAGU,iBACR,uBACA,6BACA,iBACA;UAEa;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../../src/worker/types.ts"],"mappings":";;;;KAkBY;UAEK;EACf,OAAO,kBAAkB;EACzB;EACA;EACA,cAAc;EACd;;UAGe;WACN;EACT,mBACE,MAAM,cACN,QAAQ,kBACR,SAAS;EAEX,iBAAiB;;UAGF;WACN;EACT,mBACE,MAAM,kBACN,QAAQ,kBACR,SAAS;EAEX,iBAAiB;;UAGF;EACf;EACA,IAAI;EACJ,MAAM;EACN,oBAAoB;EACpB;EACA,qBAAqB;;UAGN;EACf;EACA,IAAI;EACJ,MAAM;EACN,oBAAoB;EACpB;EACA,qBAAqB;;UAGN;EACf;EACA,IAAI;EACJ,eAAe;EACf,sBAAsB;EACtB,gBAAgB;EAChB,oBAAoB;EACpB;EACA,qBAAqB;;UAGN;EACf,MAAM,QAAQ;EACd,MAAM;;UAGS;EACf;EACA,IAAI;EACJ,eAAe;EACf,gBAAgB;;KAGN,gBACR,KAAK,2BACL,KAAK;KAEG,gBACR,oBACA,oBACA,0BACA;UAEa;EACf;EACA;EACA,IAAI;EACJ,QAAQ;EACR,SAAS;EACT;;UAGe;EACf;EACA;EACA,IAAI;EACJ,QAAQ;EACR,SAAS;EACT;;UAGe;EACf;EACA;EACA,IAAI;EACJ;;UAGe;EACf;EACA;EACA,IAAI;EACJ;;UAGe;EACf;EACA,IAAI;EACJ;EACA;;KAGU,wBACR,4BACA;KAEQ,iBACR,wBACA,sBACA,4BACA;UAEa;;;;;EAKf,qBAAqB;;;;;EAMrB;;;;;EAMA;;;;;;;;;;;;;EAcA,iBAAiB,OAAO,aAAa,OAAO,QAAQ;EAEpD;;;;;;;;;;;EAYA;;UAGe,0CAA0C,QAAQ;EACjE,QAAQ;EACR,uBAAuB;;UAGR;EACf;EACA,IAAI;EACJ,SAAS;EACT,QAAQ;EACR,OAAO,OAAO;EACd;;UAGe;EACf;EACA,IAAI;EACJ,SAAS;EACT,QAAQ;EACR,OAAO,OAAO;EACd;;UAGe;EACf;EACA,OAAO,OAAO;;UAGC;EACf;EACA,IAAI;EACJ,SAAS;;EAET;EACA,WAAW,IAAI;EAGf;EACA;EACA,WAAW,IAAI;EACf;EACA;;UAGe;EACf;EACA,IAAI;EACJ,SAAS;;EAET;EACA,WAAW,IAAI;EAGf;EACA;EACA,WAAW,IAAI;EACf;EACA;;KAGU,iBACR,uBACA,6BACA,iBACA;UAEa;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA"}
|