@pierre/diffs 1.2.7 → 1.2.8

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.
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","names":["CodeViewLayout","HunkExpansionRegion","RenderRange","SmoothScrollSettings","ThemesType","VirtualFileMetrics","DIFFS_TAG_NAME","DIFFS_DEVELOPMENT_BUILD","COMMIT_METADATA_SPLIT","RegExp","GIT_DIFF_FILE_BREAK_REGEX","UNIFIED_DIFF_FILE_BREAK_REGEX","FILE_CONTEXT_BLOB","HUNK_HEADER","SPLIT_WITH_NEWLINES","FILENAME_HEADER_REGEX","FILENAME_HEADER_REGEX_GIT","ALTERNATE_FILE_NAMES_GIT","INDEX_LINE_METADATA","MERGE_CONFLICT_START_MARKER_REGEX","MERGE_CONFLICT_BASE_MARKER_REGEX","MERGE_CONFLICT_SEPARATOR_MARKER_REGEX","MERGE_CONFLICT_END_MARKER_REGEX","HEADER_PREFIX_SLOT_ID","HEADER_METADATA_SLOT_ID","CUSTOM_HEADER_SLOT_ID","DEFAULT_THEMES","THEME_CSS_ATTRIBUTE","UNSAFE_CSS_ATTRIBUTE","CORE_CSS_ATTRIBUTE","DIFFS_SCROLLBAR_MEASURE_ATTRIBUTE","DIFFS_SCROLLBAR_GUTTER_MEASURED_PROPERTY","DEFAULT_COLLAPSED_CONTEXT_THRESHOLD","DEFAULT_TOKENIZE_MAX_LENGTH","DEFAULT_VIRTUAL_FILE_METRICS","DEFAULT_CODE_VIEW_FILE_METRICS","DEFAULT_CODE_VIEW_LAYOUT","DEFAULT_SMOOTH_SCROLL_SETTINGS","DEFAULT_EXPANDED_REGION","DEFAULT_RENDER_RANGE","EMPTY_RENDER_RANGE"],"sources":["../src/constants.d.ts"],"sourcesContent":["import type { CodeViewLayout, HunkExpansionRegion, RenderRange, SmoothScrollSettings, ThemesType, VirtualFileMetrics } from './types';\nexport declare const DIFFS_TAG_NAME: \"diffs-container\";\nexport declare const DIFFS_DEVELOPMENT_BUILD: boolean;\nexport declare const COMMIT_METADATA_SPLIT: RegExp;\nexport declare const GIT_DIFF_FILE_BREAK_REGEX: RegExp;\nexport declare const UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp;\nexport declare const FILE_CONTEXT_BLOB: RegExp;\nexport declare const HUNK_HEADER: RegExp;\nexport declare const SPLIT_WITH_NEWLINES: RegExp;\nexport declare const FILENAME_HEADER_REGEX: RegExp;\nexport declare const FILENAME_HEADER_REGEX_GIT: RegExp;\nexport declare const ALTERNATE_FILE_NAMES_GIT: RegExp;\nexport declare const INDEX_LINE_METADATA: RegExp;\nexport declare const MERGE_CONFLICT_START_MARKER_REGEX: RegExp;\nexport declare const MERGE_CONFLICT_BASE_MARKER_REGEX: RegExp;\nexport declare const MERGE_CONFLICT_SEPARATOR_MARKER_REGEX: RegExp;\nexport declare const MERGE_CONFLICT_END_MARKER_REGEX: RegExp;\nexport declare const HEADER_PREFIX_SLOT_ID = \"header-prefix\";\nexport declare const HEADER_METADATA_SLOT_ID = \"header-metadata\";\nexport declare const CUSTOM_HEADER_SLOT_ID = \"header-custom\";\nexport declare const DEFAULT_THEMES: ThemesType;\nexport declare const THEME_CSS_ATTRIBUTE = \"data-theme-css\";\nexport declare const UNSAFE_CSS_ATTRIBUTE = \"data-unsafe-css\";\nexport declare const CORE_CSS_ATTRIBUTE = \"data-core-css\";\nexport declare const DIFFS_SCROLLBAR_MEASURE_ATTRIBUTE = \"data-diffs-scrollbar-measure\";\nexport declare const DIFFS_SCROLLBAR_GUTTER_MEASURED_PROPERTY = \"--diffs-scrollbar-gutter-measured\";\nexport declare const DEFAULT_COLLAPSED_CONTEXT_THRESHOLD = 1;\nexport declare const DEFAULT_TOKENIZE_MAX_LENGTH = 100000;\nexport declare const DEFAULT_VIRTUAL_FILE_METRICS: VirtualFileMetrics;\nexport declare const DEFAULT_CODE_VIEW_FILE_METRICS: VirtualFileMetrics;\nexport declare const DEFAULT_CODE_VIEW_LAYOUT: CodeViewLayout;\nexport declare const DEFAULT_SMOOTH_SCROLL_SETTINGS: SmoothScrollSettings;\nexport declare const DEFAULT_EXPANDED_REGION: HunkExpansionRegion;\nexport declare const DEFAULT_RENDER_RANGE: RenderRange;\nexport declare const EMPTY_RENDER_RANGE: RenderRange;\n//# sourceMappingURL=constants.d.ts.map"],"mappings":";;;cACqBM;cACAC;AADAD,cAEAE,qBAFiC,EAEVC,MAFU;AACjCF,cAEAG,yBAFgC,EAELD,MAFK;AAChCD,cAEAG,6BAF6B,EAEEF,MAFF;AAC7BC,cAEAE,iBAFiC,EAEdH,MAFQA;AAC3BE,cAEAE,WAFAF,EAEaF,MAFwB;AACrCG,cAEAE,mBAFmBL,EAEEA,MAFI;AACzBI,cAEAE,qBAFmB,EAEIN,MAFJ;AACnBK,cAEAE,yBAF2B,EAEAP,MAFA;AAC3BM,cAEAE,wBAFuBR,EAEGA,MAFG;AAC7BO,cAEAE,mBAFiC,EAEZT,MAFMA;AAC3BQ,cAEAE,iCAFgC,EAEGV,MAFH;AAChCS,cAEAE,gCAF2B,EAEOX,MAFP;AAC3BU,cAEAE,qCAFmCZ,EAEIA,MAFE;AACzCW,cAEAE,+BAFkCb,EAEDA,MAFO;AACxCY,cAEAE,qBAAAA,GAF6C,eAANd;AACvCa,cAEAE,uBAAAA,GAFuC,iBAAA;AACvCD,cAEAE,qBAAAA,GAFqB,eAAA;AACrBD,cAEAE,cAFuB,EAEPtB,UAFO;AACvBqB,cAEAE,mBAAAA,GAFqB,gBAAA;AACrBD,cAEAE,oBAAAA,GAF0B,iBAAA;AAC1BD,cAEAE,kBAAAA,GAFmB,eAAA;AACnBD,cAEAE,iCAAAA,GAFoB,8BAAA;AACpBD,cAEAE,wCAAAA,GAFkB,mCAAA;AAClBD,cAEAE,mCAAAA,GAFiC,CAAA;AACjCD,cAEAE,2BAAAA,GAFwC,MAAA;AACxCD,cAEAE,4BAFmC,EAEL7B,kBAFK;AACnC4B,cAEAE,8BAF2B,EAEK9B,kBAFL;AAC3B6B,cAEAE,wBAFgD,EAEtBpC,cAFIK;AAC9B8B,cAEAE,8BAFgChC,EAEAF,oBAFkB;AAClDiC,cAEAE,uBAF0BtC,EAEDC,mBAFe;AACxCoC,cAEAE,oBAFoD,EAE9BrC,WAFUC;AAChCmC,cAEAE,kBAF4C,EAExBtC,WAFKD"}
1
+ {"version":3,"file":"constants.d.ts","names":["CodeViewLayout","HunkExpansionRegion","RenderRange","SmoothScrollSettings","ThemesType","VirtualFileMetrics","DIFFS_TAG_NAME","DIFFS_DEVELOPMENT_BUILD","COMMIT_METADATA_SPLIT","RegExp","GIT_DIFF_FILE_BREAK_REGEX","UNIFIED_DIFF_FILE_BREAK_REGEX","FILE_CONTEXT_BLOB","HUNK_HEADER","SPLIT_WITH_NEWLINES","FILENAME_HEADER_REGEX","FILENAME_HEADER_REGEX_GIT","ALTERNATE_FILE_NAMES_GIT","INDEX_LINE_METADATA","MERGE_CONFLICT_START_MARKER_REGEX","MERGE_CONFLICT_BASE_MARKER_REGEX","MERGE_CONFLICT_SEPARATOR_MARKER_REGEX","MERGE_CONFLICT_END_MARKER_REGEX","HEADER_PREFIX_SLOT_ID","HEADER_METADATA_SLOT_ID","CUSTOM_HEADER_SLOT_ID","DEFAULT_THEMES","THEME_CSS_ATTRIBUTE","UNSAFE_CSS_ATTRIBUTE","CORE_CSS_ATTRIBUTE","DIFFS_SCROLLBAR_MEASURE_ATTRIBUTE","DIFFS_SCROLLBAR_GUTTER_MEASURED_PROPERTY","DEFAULT_COLLAPSED_CONTEXT_THRESHOLD","DEFAULT_TOKENIZE_MAX_LENGTH","DEFAULT_VIRTUAL_FILE_METRICS","DEFAULT_CODE_VIEW_FILE_METRICS","DEFAULT_CODE_VIEW_LAYOUT","DEFAULT_SMOOTH_SCROLL_SETTINGS","DEFAULT_EXPANDED_REGION","DEFAULT_RENDER_RANGE","EMPTY_RENDER_RANGE"],"sources":["../src/constants.d.ts"],"sourcesContent":["import type { CodeViewLayout, HunkExpansionRegion, RenderRange, SmoothScrollSettings, ThemesType, VirtualFileMetrics } from './types';\nexport declare const DIFFS_TAG_NAME: \"diffs-container\";\nexport declare const DIFFS_DEVELOPMENT_BUILD: boolean;\nexport declare const COMMIT_METADATA_SPLIT: RegExp;\nexport declare const GIT_DIFF_FILE_BREAK_REGEX: RegExp;\nexport declare const UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp;\nexport declare const FILE_CONTEXT_BLOB: RegExp;\nexport declare const HUNK_HEADER: RegExp;\nexport declare const SPLIT_WITH_NEWLINES: RegExp;\nexport declare const FILENAME_HEADER_REGEX: RegExp;\nexport declare const FILENAME_HEADER_REGEX_GIT: RegExp;\nexport declare const ALTERNATE_FILE_NAMES_GIT: RegExp;\nexport declare const INDEX_LINE_METADATA: RegExp;\nexport declare const MERGE_CONFLICT_START_MARKER_REGEX: RegExp;\nexport declare const MERGE_CONFLICT_BASE_MARKER_REGEX: RegExp;\nexport declare const MERGE_CONFLICT_SEPARATOR_MARKER_REGEX: RegExp;\nexport declare const MERGE_CONFLICT_END_MARKER_REGEX: RegExp;\nexport declare const HEADER_PREFIX_SLOT_ID = \"header-prefix\";\nexport declare const HEADER_METADATA_SLOT_ID = \"header-metadata\";\nexport declare const CUSTOM_HEADER_SLOT_ID = \"header-custom\";\nexport declare const DEFAULT_THEMES: ThemesType;\nexport declare const THEME_CSS_ATTRIBUTE = \"data-theme-css\";\nexport declare const UNSAFE_CSS_ATTRIBUTE = \"data-unsafe-css\";\nexport declare const CORE_CSS_ATTRIBUTE = \"data-core-css\";\nexport declare const DIFFS_SCROLLBAR_MEASURE_ATTRIBUTE = \"data-diffs-scrollbar-measure\";\nexport declare const DIFFS_SCROLLBAR_GUTTER_MEASURED_PROPERTY = \"--diffs-scrollbar-gutter-measured\";\nexport declare const DEFAULT_COLLAPSED_CONTEXT_THRESHOLD = 1;\nexport declare const DEFAULT_TOKENIZE_MAX_LENGTH = 100000;\nexport declare const DEFAULT_VIRTUAL_FILE_METRICS: VirtualFileMetrics;\nexport declare const DEFAULT_CODE_VIEW_FILE_METRICS: VirtualFileMetrics;\nexport declare const DEFAULT_CODE_VIEW_LAYOUT: CodeViewLayout;\nexport declare const DEFAULT_SMOOTH_SCROLL_SETTINGS: SmoothScrollSettings;\nexport declare const DEFAULT_EXPANDED_REGION: HunkExpansionRegion;\nexport declare const DEFAULT_RENDER_RANGE: RenderRange;\nexport declare const EMPTY_RENDER_RANGE: RenderRange;\n//# sourceMappingURL=constants.d.ts.map"],"mappings":";;;cACqBM;cACAC;AADAD,cAEAE,qBAFiC,EAEVC,MAFU;AACjCF,cAEAG,yBAFgC,EAELD,MAFK;AAChCD,cAEAG,6BAF6B,EAEEF,MAFF;AAC7BC,cAEAE,iBAFiC,EAEdH,MAFQA;AAC3BE,cAEAE,WAFAF,EAEaF,MAFwB;AACrCG,cAEAE,mBAFmBL,EAEEA,MAFI;AACzBI,cAEAE,qBAFmB,EAEIN,MAFJ;AACnBK,cAEAE,yBAF2B,EAEAP,MAFA;AAC3BM,cAEAE,wBAFuBR,EAEGA,MAFG;AAC7BO,cAEAE,mBAFiC,EAEZT,MAFMA;AAC3BQ,cAEAE,iCAFgC,EAEGV,MAFH;AAChCS,cAEAE,gCAF2B,EAEOX,MAFP;AAC3BU,cAEAE,qCAFmCZ,EAEIA,MAFE;AACzCW,cAEAE,+BAFkCb,EAEDA,MAFO;AACxCY,cAEAE,qBAAAA,GAF6C,eAANd;AACvCa,cAEAE,uBAAAA,GAFuC,iBAAA;AACvCD,cAEAE,qBAAAA,GAFqB,eAAA;AACrBD,cAEAE,cAFuB,EAEPtB,UAFO;AACvBqB,cAEAE,mBAAAA,GAFqB,gBAAA;AACrBD,cAEAE,oBAAAA,GAFgBxB,iBAAU;AAC1BuB,cAEAE,kBAAAA,GAFmB,eAAA;AACnBD,cAEAE,iCAAAA,GAFoB,8BAAA;AACpBD,cAEAE,wCAAAA,GAFkB,mCAAA;AAClBD,cAEAE,mCAAAA,GAFiC,CAAA;AACjCD,cAEAE,2BAAAA,GAFwC,MAAA;AACxCD,cAEAE,4BAFmC,EAEL7B,kBAFK;AACnC4B,cAEAE,8BAF2B,EAEK9B,kBAFL;AAC3B6B,cAEAE,wBAFgD,EAEtBpC,cAFIK;AAC9B8B,cAEAE,8BAFgChC,EAEAF,oBAFkB;AAClDiC,cAEAE,uBAF0BtC,EAEDC,mBAFe;AACxCoC,cAEAE,oBAFoD,EAE9BrC,WAFUC;AAChCmC,cAEAE,kBAF4C,EAExBtC,WAFKD"}
@@ -1 +1 @@
1
- {"version":3,"file":"InteractionManager.d.ts","names":["AnnotationSide","DiffLineEventBaseProps","DiffTokenEventBaseProps","ExpansionDirections","LineEventBaseProps","MergeConflictResolution","SelectedLineRange","SelectionSide","TokenEventBase","LogTypes","InteractionManagerMode","OnLineClickProps","PointerEvent","OnLineEnterLeaveProps","OnDiffLineClickProps","OnDiffLineEnterLeaveProps","SelectionWriteOptions","GetLineIndexUtility","EventClickProps","TMode","PointerEventEnterLeaveProps","OnTokenEventProps","GetHoveredLineResult","MergeConflictActionTarget","InteractionManagerBaseOptions","MouseEvent","InteractionManagerOptions","InteractionManager","HTMLPreElement","InteractionPluckOptions","HTMLElement","pluckInteractionOptions","enableTokenInteractionsOnWhitespace","enableGutterUtility","lineHoverHighlight","onGutterUtilityClick","onLineClick","onLineEnter","onLineLeave","onLineNumberClick","onTokenClick","onTokenEnter","onTokenLeave","renderGutterUtility","__debugPointerEvents","enableLineSelection","controlledSelection","onLineSelected","onLineSelectionStart","onLineSelectionChange","onLineSelectionEnd"],"sources":["../../src/managers/InteractionManager.d.ts"],"sourcesContent":["import type { AnnotationSide, DiffLineEventBaseProps, DiffTokenEventBaseProps, ExpansionDirections, LineEventBaseProps, MergeConflictResolution, SelectedLineRange, SelectionSide, TokenEventBase } from '../types';\nexport type LogTypes = 'click' | 'move' | 'both' | 'none';\nexport type InteractionManagerMode = 'file' | 'diff';\nexport interface OnLineClickProps extends LineEventBaseProps {\n event: PointerEvent;\n}\nexport interface OnLineEnterLeaveProps extends LineEventBaseProps {\n event: PointerEvent;\n}\nexport interface OnDiffLineClickProps extends DiffLineEventBaseProps {\n event: PointerEvent;\n}\nexport interface OnDiffLineEnterLeaveProps extends DiffLineEventBaseProps {\n event: PointerEvent;\n}\nexport interface SelectionWriteOptions {\n notify?: boolean;\n}\nexport type GetLineIndexUtility = (lineNumber: number, side?: SelectionSide) => [number, number] | undefined;\ntype EventClickProps<TMode extends InteractionManagerMode> = TMode extends 'file' ? OnLineClickProps : OnDiffLineClickProps;\ntype PointerEventEnterLeaveProps<TMode extends InteractionManagerMode> = TMode extends 'file' ? OnLineEnterLeaveProps : OnDiffLineEnterLeaveProps;\nexport type OnTokenEventProps<TMode extends InteractionManagerMode> = TMode extends 'file' ? TokenEventBase : DiffTokenEventBaseProps;\nexport type GetHoveredLineResult<TMode extends InteractionManagerMode> = TMode extends 'file' ? {\n lineNumber: number;\n} : {\n lineNumber: number;\n side: AnnotationSide;\n};\nexport interface MergeConflictActionTarget {\n kind: 'merge-conflict-action';\n resolution: MergeConflictResolution;\n conflictIndex: number;\n}\nexport interface InteractionManagerBaseOptions<TMode extends InteractionManagerMode> {\n lineHoverHighlight?: 'disabled' | 'both' | 'number' | 'line';\n enableTokenInteractionsOnWhitespace?: boolean;\n enableGutterUtility?: boolean;\n onGutterUtilityClick?(range: SelectedLineRange): unknown;\n onLineClick?(props: EventClickProps<TMode>): unknown;\n onLineNumberClick?(props: EventClickProps<TMode>): unknown;\n onLineEnter?(props: PointerEventEnterLeaveProps<TMode>): unknown;\n onLineLeave?(props: PointerEventEnterLeaveProps<TMode>): unknown;\n onTokenClick?(props: OnTokenEventProps<TMode>, event: MouseEvent): unknown;\n onTokenEnter?(props: OnTokenEventProps<TMode>, event: PointerEvent): unknown;\n onTokenLeave?(props: OnTokenEventProps<TMode>, event: PointerEvent): unknown;\n __debugPointerEvents?: LogTypes;\n enableLineSelection?: boolean;\n controlledSelection?: boolean;\n onLineSelected?: (range: SelectedLineRange | null) => void;\n onLineSelectionStart?: (range: SelectedLineRange | null) => void;\n onLineSelectionChange?: (range: SelectedLineRange | null) => void;\n onLineSelectionEnd?: (range: SelectedLineRange | null) => void;\n getLineIndex?: GetLineIndexUtility;\n}\nexport interface InteractionManagerOptions<TMode extends InteractionManagerMode> extends InteractionManagerBaseOptions<TMode> {\n usesCustomGutterUtility?: boolean;\n onHunkExpand?(hunkIndex: number, direction: ExpansionDirections, expansionLineCountOverride?: number): unknown;\n onMergeConflictActionClick?(target: MergeConflictActionTarget): void;\n}\nexport declare class InteractionManager<TMode extends InteractionManagerMode> {\n private mode;\n private options;\n private hoveredLine;\n private hoveredToken;\n private pre;\n private gutterUtilityLine;\n private gutterUtilityContainer;\n private gutterUtilityButton;\n private gutterUtilitySlot;\n private interactiveLinesAttr;\n private interactiveLineNumbersAttr;\n private hasPointerListeners;\n private hasDocumentPointerListeners;\n private selectedRange;\n private proposedSelectedRange;\n private renderedSelectionRange;\n private selectionAnchor;\n private queuedSelectionRender;\n private pointerSession;\n constructor(mode: TMode, options: InteractionManagerOptions<TMode>);\n setOptions(options: InteractionManagerOptions<TMode>): void;\n cleanUp(): void;\n setup(pre: HTMLPreElement): void;\n setSelectionDirty(): void;\n isSelectionDirty(): boolean;\n setSelection(range: SelectedLineRange | null, options?: SelectionWriteOptions): void;\n getSelection(): SelectedLineRange | null;\n getHoveredLine: () => GetHoveredLineResult<TMode> | undefined;\n handlePointerClick: (event: MouseEvent) => void;\n handlePointerMove: (event: PointerEvent) => void;\n handlePointerLeave: (event: PointerEvent) => void;\n private handlePointerEvent;\n private syncPointerListeners;\n private updateInteractiveLineAttributes;\n private handlePointerDown;\n private startLineSelectionFromPointerDown;\n private startGutterSelectionFromPointerDown;\n private handleDocumentPointerMove;\n private handleDocumentPointerUp;\n private handleDocumentPointerCancel;\n private clearHoveredLine;\n private setHoveredLine;\n private clearHoveredToken;\n private setHoveredToken;\n private ensureGutterUtilityNode;\n private revealUtilityFromGutterPath;\n private placeUtility;\n private placeUtilityFromSelection;\n private showUtilityOnLine;\n private hideUtility;\n private currentSelectionEnds;\n private selectionEnds;\n private selectionPointRowIndex;\n private targetForSelectionPoint;\n private attachDocumentPointerListeners;\n private detachDocumentPointerListeners;\n private clearPointerSession;\n private clearPendingSingleLineState;\n private selectionInfoFromPath;\n private resolveSelectionInfo;\n private selectionPointFromPath;\n private resolveSelectionPoint;\n private resolveSelectionPath;\n private pathFromCoordinates;\n private pathFromEventPath;\n private pathFromElement;\n private pathFromAnnotationSlot;\n private hitTest;\n private getLineIndex;\n private getCurrentSelectionRange;\n private clearProposedSelection;\n private updateSelection;\n private getIndexesFromSelection;\n private renderSelection;\n private notifySelectionCommitted;\n private notifySelectionChangeDelta;\n private notifySelectionStart;\n private notifySelectionEnd;\n private toEventBaseProps;\n private toTokenEventBaseProps;\n private buildSelectedLineRange;\n private buildSelectionRange;\n private resolvePointerTarget;\n private isSplitDiff;\n private parseLineIndex;\n}\ntype InteractionPluckOptions<TMode extends InteractionManagerMode> = InteractionManagerBaseOptions<TMode> & {\n renderGutterUtility?(getHoveredRow: () => GetHoveredLineResult<TMode> | undefined): HTMLElement | null | undefined;\n};\nexport declare function pluckInteractionOptions<TMode extends InteractionManagerMode>({ enableTokenInteractionsOnWhitespace, enableGutterUtility, lineHoverHighlight, onGutterUtilityClick, onLineClick, onLineEnter, onLineLeave, onLineNumberClick, onTokenClick, onTokenEnter, onTokenLeave, renderGutterUtility, __debugPointerEvents, enableLineSelection, controlledSelection, onLineSelected, onLineSelectionStart, onLineSelectionChange, onLineSelectionEnd }: InteractionPluckOptions<TMode>, onHunkExpand?: (hunkIndex: number, direction: ExpansionDirections, expansionLineCountOverride?: number) => unknown, getLineIndex?: GetLineIndexUtility, onMergeConflictActionClick?: (target: MergeConflictActionTarget) => void): InteractionManagerOptions<TMode>;\nexport {};\n//# sourceMappingURL=InteractionManager.d.ts.map"],"mappings":";;;KACYS,QAAAA;KACAC,sBAAAA;AADAD,UAEKE,gBAAAA,SAAyBP,kBAFtB,CAAA;EACRM,KAAAA,EAEDE,YAFCF;AACZ;AAGiBG,UAAAA,qBAAAA,SAA8BT,kBAAAA,CAAAA;EAG9BU,KAAAA,EAFNF,YAEME;AAGjB;AAGiBE,UANAF,oBAAAA,SAA6Bb,sBAMR,CAAA;EAG1BgB,KAAAA,EARDL,YAQCK;AAAiG;AAC1EP,UAPlBK,yBAAAA,SAAkCd,sBAOhBS,CAAAA;EAA0BS,KAAAA,EANlDP,YAMkDO;;AAA0CL,UAJtFE,qBAAAA,CAIsFF;EAAoB,MAAA,CAAA,EAAA,OAAA;AAAA;AAC5EJ,KAFnCO,mBAAAA,GAEmCP,CAAAA,UAAAA,EAAAA,MAAAA,EAAAA,IAAAA,CAAAA,EAFeH,aAEfG,EAAAA,GAAAA,CAAAA,MAAAA,EAAAA,MAAAA,CAAAA,GAAAA,SAAAA;KAD1CQ,eACoEC,CAAAA,cADtCT,sBACsCS,CAAAA,GADZA,KACYA,SAAAA,MAAAA,GADWR,gBACXQ,GAD8BL,oBAC9BK;KAApEC,2BAA2FP,CAAAA,cAAjDH,sBAAiDG,CAAAA,GAAvBM,KAAuBN,SAAAA,MAAAA,GAAAA,qBAAAA,GAAwBE,yBAAxBF;AAAwBE,KAC5GM,iBAD4GN,CAAAA,cAC5EL,sBAD4EK,CAAAA,GAClDI,KADkDJ,SAAAA,MAAAA,GAC3BP,cAD2BO,GACVb,uBADUa;AAAyB,KAErIO,oBAFqI,CAAA,cAElGZ,sBAFkG,CAAA,GAExES,KAFwE,SAAA,MAAA,GAAA;EACrIE,UAAAA,EAAAA,MAAAA;CAAgCX,GAAAA;EAA0BS,UAAAA,EAAAA,MAAAA;EAAuBX,IAAAA,EAKnFR,cALmFQ;CAAiBN;AAAuB,UAOpHqB,yBAAAA,CAPoH;EACzHD,IAAAA,EAAAA,uBAAoBH;EAAeT,UAAAA,EAQ/BL,uBAR+BK;EAA0BS,aAAAA,EAAAA,MAAAA;;AAIjD,UAOPK,6BAPO,CAAA,cAOqCd,sBAPrC,CAAA,CAAA;EAEPa,kBAAAA,CAAAA,EAAAA,UAAyB,GAAA,MAE1BlB,GAAAA,QAAAA,GAAAA,MAAAA;EAGCmB,mCAA6B,CAAA,EAAAL,OAAAA;EAAeT,mBAAAA,CAAAA,EAAAA,OAAAA;EAI5BJ,oBAAAA,EAAAA,KAAAA,EAAAA,iBAAAA,CAAAA,EAAAA,OAAAA;EACOa,WAAAA,EAAAA,KAAAA,EAAhBD,eAAgBC,CAAAA,KAAAA,CAAAA,CAAAA,EAAAA,OAAAA;EAAhBD,iBAAAA,EAAAA,KAAAA,EACMA,eADNA,CACsBC,KADtBD,CAAAA,CAAAA,EAAAA,OAAAA;EACsBC,WAAAA,EAAAA,KAAAA,EACtBC,2BADsBD,CACMA,KADNA,CAAAA,CAAAA,EAAAA,OAAAA;EAAhBD,WAAAA,EAAAA,KAAAA,EAENE,2BAFMF,CAEsBC,KAFtBD,CAAAA,CAAAA,EAAAA,OAAAA;EACsBC,YAAAA,EAAAA,KAAAA,EAE3BE,iBAF2BF,CAETA,KAFSA,CAAAA,EAAAA,KAAAA,EAEMM,UAFNN,CAAAA,EAAAA,OAAAA;EAA5BC,YAAAA,EAAAA,KAAAA,EAGCC,iBAHDD,CAGmBD,KAHnBC,CAAAA,EAAAA,KAAAA,EAGkCR,YAHlCQ,CAAAA,EAAAA,OAAAA;EAC4BD,YAAAA,EAAAA,KAAAA,EAG3BE,iBAH2BF,CAGTA,KAHSA,CAAAA,EAAAA,KAAAA,EAGMP,YAHNO,CAAAA,EAAAA,OAAAA;EAA5BC,oBAAAA,CAAAA,EAIGX,QAJHW;EACmBD,mBAAAA,CAAAA,EAAAA,OAAAA;EAAlBE,mBAAAA,CAAAA,EAAAA,OAAAA;EAAiCI,cAAAA,CAAAA,EAAAA,CAAAA,KAAAA,EAM7BnB,iBAN6BmB,GAAAA,IAAAA,EAAAA,GAAAA,IAAAA;EACfN,oBAAAA,CAAAA,EAAAA,CAAAA,KAAAA,EAMRb,iBANQa,GAAAA,IAAAA,EAAAA,GAAAA,IAAAA;EAAlBE,qBAAAA,CAAAA,EAAAA,CAAAA,KAAAA,EAOWf,iBAPXe,GAAAA,IAAAA,EAAAA,GAAAA,IAAAA;EAAiCT,kBAAAA,CAAAA,EAAAA,CAAAA,KAAAA,EAQzBN,iBARyBM,GAAAA,IAAAA,EAAAA,GAAAA,IAAAA;EACfO,YAAAA,CAAAA,EAQxBF,mBARwBE;;AAAeP,UAUzCc,yBAVyCd,CAAAA,cAUDF,sBAVCE,CAAAA,SAU+BY,6BAV/BZ,CAU6DO,KAV7DP,CAAAA,CAAAA;EAC/BH,uBAAAA,CAAAA,EAAAA,OAAAA;EAGEH,YAAAA,EAAAA,SAAAA,EAAAA,MAAAA,EAAAA,SAAAA,EAQmBH,mBARnBG,EAAAA,0BAAAA,CAAAA,EAAAA,MAAAA,CAAAA,EAAAA,OAAAA;EACMA,0BAAAA,EAAAA,MAAAA,EAQKiB,yBARLjB,CAAAA,EAAAA,IAAAA;;AAEFA,cAQZqB,kBARYrB,CAAAA,cAQqBI,sBARrBJ,CAAAA,CAAAA;EACdW,QAAAA,IAAAA;EAAmB,QAAA,OAAA;EAErBS,QAAAA,WAAAA;EAAwChB,QAAAA,YAAAA;EAA8DS,QAAAA,GAAAA;EAEvEhB,QAAAA,iBAAAA;EACRoB,QAAAA,sBAAAA;EAHiDC,QAAAA,mBAAAA;EAA6B,QAAA,iBAAA;EAKjGG,QAAAA,oBAAkBR;EAAeT,QAAAA,0BAAAA;EAoBhCS,QAAAA,mBAAAA;EAA0CA,QAAAA,2BAAAA;EAA1BO,QAAAA,aAAAA;EACYP,QAAAA,qBAAAA;EAA1BO,QAAAA,sBAAAA;EAETE,QAAAA,eAAAA;EAGStB,QAAAA,qBAAAA;EAAoCU,QAAAA,cAAAA;EACxCV,WAAAA,CAAAA,IAAAA,EAPEa,KAOFb,EAAAA,OAAAA,EAPkBoB,yBAOlBpB,CAP4Ca,KAO5Cb,CAAAA;EAC2Ba,UAAAA,CAAAA,OAAAA,EAPvBO,yBAOuBP,CAPGA,KAOHA,CAAAA,CAAAA,EAAAA,IAAAA;EAArBG,OAAAA,CAAAA,CAAAA,EAAAA,IAAAA;EACMG,KAAAA,CAAAA,GAAAA,EANjBG,cAMiBH,CAAAA,EAAAA,IAAAA;EACDb,iBAAAA,CAAAA,CAAAA,EAAAA,IAAAA;EACCA,gBAAAA,CAAAA,CAAAA,EAAAA,OAAAA;EAAY,YAAA,CAAA,KAAA,EALpBN,iBAKoB,GAAA,IAAA,EAAA,OAAA,CAAA,EALgBU,qBAKhB,CAAA,EAAA,IAAA;EAwDvCa,YAAAA,CAAAA,CAAAA,EA5DevB,iBA4DQa,GAAAA,IAAAA;EAAeT,cAAAA,EAAAA,GAAAA,GA3DjBY,oBA2DiBZ,CA3DIS,KA2DJT,CAAAA,GAAAA,SAAAA;EAAwDS,kBAAAA,EAAAA,CAAAA,KAAAA,EA1DnEM,UA0DmEN,EAAAA,GAAAA,IAAAA;EAA9BK,iBAAAA,EAAAA,CAAAA,KAAAA,EAzDtCZ,YAyDsCY,EAAAA,GAAAA,IAAAA;EACFL,kBAAAA,EAAAA,CAAAA,KAAAA,EAzDnCP,YAyDmCO,EAAAA,GAAAA,IAAAA;EAArBG,QAAAA,kBAAAA;EAA0CQ,QAAAA,oBAAAA;EAAW,QAAA,+BAAA;EAE3EC,QAAAA,iBAAAA;EAAsCrB,QAAAA,iCAAAA;EAA0BsB,QAAAA,mCAAAA;EAAqCC,QAAAA,yBAAAA;EAAqBC,QAAAA,uBAAAA;EAAoBC,QAAAA,2BAAAA;EAAsBC,QAAAA,gBAAAA;EAAaC,QAAAA,cAAAA;EAAaC,QAAAA,iBAAAA;EAAaC,QAAAA,eAAAA;EAAmBC,QAAAA,uBAAAA;EAAcC,QAAAA,2BAAAA;EAAcC,QAAAA,YAAAA;EAAcC,QAAAA,yBAAAA;EAAqBC,QAAAA,iBAAAA;EAAsBC,QAAAA,WAAAA;EAAqBC,QAAAA,oBAAAA;EAAqBC,QAAAA,aAAAA;EAAgBC,QAAAA,sBAAAA;EAAsBC,QAAAA,uBAAAA;EAAuBC,QAAAA,8BAAAA;EAA8C/B,QAAAA,8BAAAA;EAAxBU,QAAAA,mBAAAA;EAA8E1B,QAAAA,2BAAAA;EAAqFc,QAAAA,qBAAAA;EAA2DM,QAAAA,oBAAAA;EAA+DJ,QAAAA,sBAAAA;EAA1BO,QAAAA,qBAAAA;EAAyB,QAAA,oBAAA;;;;;;;;;;;;;;;;;;;;;;;;KAH/tBG,sCAAsCnB,0BAA0Bc,8BAA8BL;4CACrDG,qBAAqBH,qBAAqBW;;iBAEhEC,sCAAsCrB;;;;;;;;;;;;;;;;;;;;GAA0YmB,wBAAwBV,sDAAsDhB,qFAAqFc,2DAA2DM,qCAAqCG,0BAA0BP"}
1
+ {"version":3,"file":"InteractionManager.d.ts","names":["AnnotationSide","DiffLineEventBaseProps","DiffTokenEventBaseProps","ExpansionDirections","LineEventBaseProps","MergeConflictResolution","SelectedLineRange","SelectionSide","TokenEventBase","LogTypes","InteractionManagerMode","OnLineClickProps","PointerEvent","OnLineEnterLeaveProps","OnDiffLineClickProps","OnDiffLineEnterLeaveProps","SelectionWriteOptions","GetLineIndexUtility","EventClickProps","TMode","PointerEventEnterLeaveProps","OnTokenEventProps","GetHoveredLineResult","MergeConflictActionTarget","InteractionManagerBaseOptions","MouseEvent","InteractionManagerOptions","InteractionManager","HTMLPreElement","InteractionPluckOptions","HTMLElement","pluckInteractionOptions","enableTokenInteractionsOnWhitespace","enableGutterUtility","lineHoverHighlight","onGutterUtilityClick","onLineClick","onLineEnter","onLineLeave","onLineNumberClick","onTokenClick","onTokenEnter","onTokenLeave","renderGutterUtility","__debugPointerEvents","enableLineSelection","controlledSelection","onLineSelected","onLineSelectionStart","onLineSelectionChange","onLineSelectionEnd"],"sources":["../../src/managers/InteractionManager.d.ts"],"sourcesContent":["import type { AnnotationSide, DiffLineEventBaseProps, DiffTokenEventBaseProps, ExpansionDirections, LineEventBaseProps, MergeConflictResolution, SelectedLineRange, SelectionSide, TokenEventBase } from '../types';\nexport type LogTypes = 'click' | 'move' | 'both' | 'none';\nexport type InteractionManagerMode = 'file' | 'diff';\nexport interface OnLineClickProps extends LineEventBaseProps {\n event: PointerEvent;\n}\nexport interface OnLineEnterLeaveProps extends LineEventBaseProps {\n event: PointerEvent;\n}\nexport interface OnDiffLineClickProps extends DiffLineEventBaseProps {\n event: PointerEvent;\n}\nexport interface OnDiffLineEnterLeaveProps extends DiffLineEventBaseProps {\n event: PointerEvent;\n}\nexport interface SelectionWriteOptions {\n notify?: boolean;\n}\nexport type GetLineIndexUtility = (lineNumber: number, side?: SelectionSide) => [number, number] | undefined;\ntype EventClickProps<TMode extends InteractionManagerMode> = TMode extends 'file' ? OnLineClickProps : OnDiffLineClickProps;\ntype PointerEventEnterLeaveProps<TMode extends InteractionManagerMode> = TMode extends 'file' ? OnLineEnterLeaveProps : OnDiffLineEnterLeaveProps;\nexport type OnTokenEventProps<TMode extends InteractionManagerMode> = TMode extends 'file' ? TokenEventBase : DiffTokenEventBaseProps;\nexport type GetHoveredLineResult<TMode extends InteractionManagerMode> = TMode extends 'file' ? {\n lineNumber: number;\n} : {\n lineNumber: number;\n side: AnnotationSide;\n};\nexport interface MergeConflictActionTarget {\n kind: 'merge-conflict-action';\n resolution: MergeConflictResolution;\n conflictIndex: number;\n}\nexport interface InteractionManagerBaseOptions<TMode extends InteractionManagerMode> {\n lineHoverHighlight?: 'disabled' | 'both' | 'number' | 'line';\n enableTokenInteractionsOnWhitespace?: boolean;\n enableGutterUtility?: boolean;\n onGutterUtilityClick?(range: SelectedLineRange): unknown;\n onLineClick?(props: EventClickProps<TMode>): unknown;\n onLineNumberClick?(props: EventClickProps<TMode>): unknown;\n onLineEnter?(props: PointerEventEnterLeaveProps<TMode>): unknown;\n onLineLeave?(props: PointerEventEnterLeaveProps<TMode>): unknown;\n onTokenClick?(props: OnTokenEventProps<TMode>, event: MouseEvent): unknown;\n onTokenEnter?(props: OnTokenEventProps<TMode>, event: PointerEvent): unknown;\n onTokenLeave?(props: OnTokenEventProps<TMode>, event: PointerEvent): unknown;\n __debugPointerEvents?: LogTypes;\n enableLineSelection?: boolean;\n controlledSelection?: boolean;\n onLineSelected?: (range: SelectedLineRange | null) => void;\n onLineSelectionStart?: (range: SelectedLineRange | null) => void;\n onLineSelectionChange?: (range: SelectedLineRange | null) => void;\n onLineSelectionEnd?: (range: SelectedLineRange | null) => void;\n getLineIndex?: GetLineIndexUtility;\n}\nexport interface InteractionManagerOptions<TMode extends InteractionManagerMode> extends InteractionManagerBaseOptions<TMode> {\n usesCustomGutterUtility?: boolean;\n onHunkExpand?(hunkIndex: number, direction: ExpansionDirections, expansionLineCountOverride?: number): unknown;\n onMergeConflictActionClick?(target: MergeConflictActionTarget): void;\n}\nexport declare class InteractionManager<TMode extends InteractionManagerMode> {\n private mode;\n private options;\n private hoveredLine;\n private hoveredToken;\n private pre;\n private gutterUtilityLine;\n private gutterUtilityContainer;\n private gutterUtilityButton;\n private gutterUtilitySlot;\n private interactiveLinesAttr;\n private interactiveLineNumbersAttr;\n private hasPointerListeners;\n private hasDocumentPointerListeners;\n private selectedRange;\n private proposedSelectedRange;\n private renderedSelectionRange;\n private selectionAnchor;\n private queuedSelectionRender;\n private pointerSession;\n constructor(mode: TMode, options: InteractionManagerOptions<TMode>);\n setOptions(options: InteractionManagerOptions<TMode>): void;\n cleanUp(): void;\n setup(pre: HTMLPreElement): void;\n setSelectionDirty(): void;\n isSelectionDirty(): boolean;\n setSelection(range: SelectedLineRange | null, options?: SelectionWriteOptions): void;\n getSelection(): SelectedLineRange | null;\n getHoveredLine: () => GetHoveredLineResult<TMode> | undefined;\n handlePointerClick: (event: MouseEvent) => void;\n handlePointerMove: (event: PointerEvent) => void;\n handlePointerLeave: (event: PointerEvent) => void;\n private handlePointerEvent;\n private syncPointerListeners;\n private updateInteractiveLineAttributes;\n private handlePointerDown;\n private startLineSelectionFromPointerDown;\n private startGutterSelectionFromPointerDown;\n private handleDocumentPointerMove;\n private handleDocumentPointerUp;\n private handleDocumentPointerCancel;\n private clearHoveredLine;\n private setHoveredLine;\n private clearHoveredToken;\n private setHoveredToken;\n private ensureGutterUtilityNode;\n private revealUtilityFromGutterPath;\n private placeUtility;\n private placeUtilityFromSelection;\n private showUtilityOnLine;\n private hideUtility;\n private currentSelectionEnds;\n private selectionEnds;\n private selectionPointRowIndex;\n private targetForSelectionPoint;\n private attachDocumentPointerListeners;\n private detachDocumentPointerListeners;\n private clearPointerSession;\n private clearPendingSingleLineState;\n private selectionInfoFromPath;\n private resolveSelectionInfo;\n private selectionPointFromPath;\n private resolveSelectionPoint;\n private resolveSelectionPath;\n private pathFromCoordinates;\n private pathFromEventPath;\n private pathFromElement;\n private pathFromAnnotationSlot;\n private hitTest;\n private getLineIndex;\n private getCurrentSelectionRange;\n private clearProposedSelection;\n private updateSelection;\n private getIndexesFromSelection;\n private renderSelection;\n private notifySelectionCommitted;\n private notifySelectionChangeDelta;\n private notifySelectionStart;\n private notifySelectionEnd;\n private toEventBaseProps;\n private toTokenEventBaseProps;\n private buildSelectedLineRange;\n private buildSelectionRange;\n private resolvePointerTarget;\n private isSplitDiff;\n private parseLineIndex;\n}\ntype InteractionPluckOptions<TMode extends InteractionManagerMode> = InteractionManagerBaseOptions<TMode> & {\n renderGutterUtility?(getHoveredRow: () => GetHoveredLineResult<TMode> | undefined): HTMLElement | null | undefined;\n};\nexport declare function pluckInteractionOptions<TMode extends InteractionManagerMode>({ enableTokenInteractionsOnWhitespace, enableGutterUtility, lineHoverHighlight, onGutterUtilityClick, onLineClick, onLineEnter, onLineLeave, onLineNumberClick, onTokenClick, onTokenEnter, onTokenLeave, renderGutterUtility, __debugPointerEvents, enableLineSelection, controlledSelection, onLineSelected, onLineSelectionStart, onLineSelectionChange, onLineSelectionEnd }: InteractionPluckOptions<TMode>, onHunkExpand?: (hunkIndex: number, direction: ExpansionDirections, expansionLineCountOverride?: number) => unknown, getLineIndex?: GetLineIndexUtility, onMergeConflictActionClick?: (target: MergeConflictActionTarget) => void): InteractionManagerOptions<TMode>;\nexport {};\n//# sourceMappingURL=InteractionManager.d.ts.map"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"jsx.d.ts","names":["DIFFS_TAG_NAME","_1","HTMLElement","React","HTMLAttributes","DetailedHTMLProps","sideEffect"],"sources":["../../src/react/jsx.d.ts"],"sourcesContent":["import 'react';\nimport type { DIFFS_TAG_NAME } from '../constants';\n\ndeclare module 'react' {\n namespace JSX {\n interface IntrinsicElements {\n [DIFFS_TAG_NAME]: React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLElement>,\n HTMLElement\n >;\n }\n }\n}\n"],"mappings":";;;;;EACmD,UAAA,GAAA,CAAA;IAAA,UAAA,iBAAA,CAAA;OAK5CA,cAAAA,CAL4C,EAK3BG,KAAAA,CAAME,iBALqB,CAM3CF,KAAAA,CAAMC,cAAeF,CAAAA,WAAAA,CAAAA,EACrBA,WADME,CACNF;IAFgBC;EAAjBH"}
1
+ {"version":3,"file":"jsx.d.ts","names":["DIFFS_TAG_NAME","_0","HTMLElement","React","HTMLAttributes","DetailedHTMLProps","sideEffect"],"sources":["../../src/react/jsx.d.ts"],"sourcesContent":["import 'react';\nimport type { DIFFS_TAG_NAME } from '../constants';\n\ndeclare module 'react' {\n namespace JSX {\n interface IntrinsicElements {\n [DIFFS_TAG_NAME]: React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLElement>,\n HTMLElement\n >;\n }\n }\n}\n"],"mappings":";;;;;EACmD,UAAA,GAAA,CAAA;IAAA,UAAA,iBAAA,CAAA;OAK5CA,cAAAA,CAL4C,EAK3BG,KAAAA,CAAME,iBALqB,CAM3CF,KAAAA,CAAMC,cAAeF,CAAAA,WAAAA,CAAAA,EACrBA,WADME,CACNF;IAFgBC;EAAjBH"}
@@ -92,7 +92,7 @@ var WorkerPoolManager = class {
92
92
  this.queueBroadcastStateChanges();
93
93
  }
94
94
  }
95
- async setRenderOptions({ theme = DEFAULT_THEMES, useTokenTransformer = false, lineDiffType = "word-alt", maxLineDiffLength = 1e3, tokenizeMaxLineLength = 1e3 }) {
95
+ async setRenderOptions({ theme = this.renderOptions.theme ?? DEFAULT_THEMES, useTokenTransformer = this.renderOptions.useTokenTransformer ?? false, lineDiffType = this.renderOptions.lineDiffType ?? "word-alt", maxLineDiffLength = this.renderOptions.maxLineDiffLength ?? 1e3, tokenizeMaxLineLength = this.renderOptions.tokenizeMaxLineLength ?? 1e3 }) {
96
96
  const { lifecycleGeneration } = this;
97
97
  const renderOptionsRequestVersion = ++this.renderOptionsRequestVersion;
98
98
  const isCurrentRequest = () => this.isCurrentLifecycle(lifecycleGeneration) && this.renderOptionsRequestVersion === renderOptionsRequestVersion;
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerPoolManager.js","names":["options: WorkerPoolOptions","newRenderOptions: WorkerRenderingOptions","resolvedThemes: ThemeRegistrationResolved[]","taskPromises: Promise<void>[]","task: SetRenderOptionsWorkerTask","resolvedLanguages: ResolvedLanguage[]","initPromises: Promise<unknown>[]","managedWorker: ManagedWorker","task: InitializeWorkerTask","task: RenderTask","worker: ManagedWorker | undefined"],"sources":["../../src/worker/WorkerPoolManager.ts"],"sourcesContent":["import LRUMapPkg from 'lru_map';\n\nimport { DEFAULT_THEMES } from '../constants';\nimport { getResolvedLanguages } from '../highlighter/languages/getResolvedLanguages';\nimport { hasResolvedLanguages } from '../highlighter/languages/hasResolvedLanguages';\nimport { resolveLanguages } from '../highlighter/languages/resolveLanguages';\nimport { getSharedHighlighter } from '../highlighter/shared_highlighter';\nimport { attachResolvedThemes } from '../highlighter/themes/attachResolvedThemes';\nimport { getResolvedThemes } from '../highlighter/themes/getResolvedThemes';\nimport { hasResolvedThemes } from '../highlighter/themes/hasResolvedThemes';\nimport { resolveThemes } from '../highlighter/themes/resolveThemes';\nimport type {\n DiffsHighlighter,\n FileContents,\n FileDiffMetadata,\n HighlighterTypes,\n HunkExpansionRegion,\n RenderDiffOptions,\n RenderDiffResult,\n RenderFileOptions,\n RenderFileResult,\n SupportedLanguages,\n ThemedDiffResult,\n ThemedFileResult,\n ThemeRegistrationResolved,\n} from '../types';\nimport { areDiffRenderOptionsEqual } from '../utils/areDiffRenderOptionsEqual';\nimport { areDiffTargetsEqual } from '../utils/areDiffTargetsEqual';\nimport { areFileRenderOptionsEqual } from '../utils/areFileRenderOptionsEqual';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport {\n getCustomExtensionsMap,\n getCustomExtensionsVersion,\n getFiletypeFromFileName,\n} from '../utils/getFiletypeFromFileName';\nimport { getThemes } from '../utils/getThemes';\nimport { isDiffPlainText } from '../utils/isDiffPlainText';\nimport { isFilePlainText } from '../utils/isFilePlainText';\nimport { renderDiffWithHighlighter } from '../utils/renderDiffWithHighlighter';\nimport { renderFileWithHighlighter } from '../utils/renderFileWithHighlighter';\nimport type {\n AllWorkerTasks,\n DiffRendererInstance,\n FileRendererInstance,\n InitializeWorkerRequest,\n InitializeWorkerTask,\n RenderDiffRequest,\n RenderDiffTask,\n RenderFileRequest,\n RenderFileTask,\n ResolvedLanguage,\n SetRenderOptionsWorkerTask,\n SubmitRequest,\n WorkerInitializationRenderOptions,\n WorkerPoolOptions,\n WorkerRenderingOptions,\n WorkerRequestId,\n WorkerResponse,\n WorkerStats,\n} from './types';\n\nconst IGNORE_RESPONSE = Symbol('IGNORE_RESPONSE');\n\nclass WorkerPoolTerminatedError extends Error {\n constructor() {\n super('WorkerPoolManager: operation canceled because the pool terminated');\n }\n}\n\ninterface GetCachesResult {\n fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n}\n\ninterface ManagedWorker {\n worker: Worker;\n requestId: string | undefined;\n pendingSetupRequestId: WorkerRequestId | undefined;\n initialized: boolean;\n langs: Set<SupportedLanguages>;\n customExtensionsVersion: number;\n}\n\ninterface ThemeSubscriber {\n onThemeChange(): void;\n}\n\ntype RenderTask = RenderFileTask | RenderDiffTask;\n\ntype RenderTaskInstance = FileRendererInstance | DiffRendererInstance;\n\nexport class WorkerPoolManager {\n private highlighter: DiffsHighlighter | undefined;\n private readonly preferredHighlighter: HighlighterTypes;\n private renderOptions: WorkerRenderingOptions;\n private renderOptionsRequestVersion = 0;\n private renderOptionsVersion = 0;\n private initialized: Promise<void> | boolean = false;\n private workers: ManagedWorker[] = [];\n // Tasks that are waiting to get processed by a worker\n private queuedTasks: RenderTask[] = [];\n private queuedTaskByInstance = new Map<RenderTaskInstance, RenderTask>();\n\n // Tasks that map to highlightKey are essentially singular, so we only\n // need one map to include queued and active\n private taskByHighlightKey = new Map<string, RenderTask>();\n\n // Tasks that have already been sent to a worker and are awaiting a response.\n private activeTaskById = new Map<WorkerRequestId, AllWorkerTasks>();\n private activeRequestByInstance = new Map<\n RenderTaskInstance,\n WorkerRequestId\n >();\n\n private nextRequestId = 0;\n private themeSubscribers = new Set<ThemeSubscriber>();\n private workersFailed = false;\n private statSubscribers = new Set<(stats: WorkerStats) => unknown>();\n private fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n private diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n private _queuedBroadcast: number | undefined;\n // Incremented on terminate so async lifecycle work can identify stale results.\n private lifecycleGeneration = 0;\n\n constructor(\n private options: WorkerPoolOptions,\n {\n langs,\n theme = DEFAULT_THEMES,\n useTokenTransformer = false,\n lineDiffType = 'word-alt',\n maxLineDiffLength = 1000,\n tokenizeMaxLineLength = 1000,\n preferredHighlighter = 'shiki-js',\n }: WorkerInitializationRenderOptions\n ) {\n this.preferredHighlighter = preferredHighlighter;\n this.renderOptions = {\n theme,\n useTokenTransformer,\n lineDiffType,\n maxLineDiffLength,\n tokenizeMaxLineLength,\n };\n this.fileCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);\n this.diffCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);\n this.queueInitialization(langs);\n }\n\n public isWorkingPool(): boolean {\n return !this.workersFailed;\n }\n\n public getFileResultCache(file: FileContents): RenderFileResult | undefined {\n return file.cacheKey != null\n ? this.fileCache.get(file.cacheKey)\n : undefined;\n }\n\n public getDiffResultCache(\n diff: FileDiffMetadata\n ): RenderDiffResult | undefined {\n return diff.cacheKey != null\n ? this.diffCache.get(diff.cacheKey)\n : undefined;\n }\n\n public inspectCaches(): GetCachesResult {\n const { fileCache, diffCache } = this;\n return { fileCache, diffCache };\n }\n\n public evictFileFromCache(cacheKey: string): boolean {\n try {\n return this.fileCache.delete(cacheKey) !== undefined;\n } finally {\n this.queueBroadcastStateChanges();\n }\n }\n\n public evictDiffFromCache(cacheKey: string): boolean {\n try {\n return this.diffCache.delete(cacheKey) !== undefined;\n } finally {\n this.queueBroadcastStateChanges();\n }\n }\n\n async setRenderOptions({\n theme = DEFAULT_THEMES,\n useTokenTransformer = false,\n lineDiffType = 'word-alt',\n maxLineDiffLength = 1000,\n tokenizeMaxLineLength = 1000,\n }: Partial<WorkerRenderingOptions>): Promise<void> {\n const { lifecycleGeneration } = this;\n const renderOptionsRequestVersion = ++this.renderOptionsRequestVersion;\n const isCurrentRequest = (): boolean =>\n this.isCurrentLifecycle(lifecycleGeneration) &&\n this.renderOptionsRequestVersion === renderOptionsRequestVersion;\n try {\n const newRenderOptions: WorkerRenderingOptions = {\n theme,\n useTokenTransformer,\n lineDiffType,\n maxLineDiffLength,\n tokenizeMaxLineLength,\n };\n if (!this.isInitialized()) {\n await this.initialize();\n }\n if (\n !isCurrentRequest() ||\n areDiffRenderOptionsEqual(newRenderOptions, this.renderOptions)\n ) {\n return;\n }\n\n const themeNames = getThemes(theme);\n let resolvedThemes: ThemeRegistrationResolved[] = [];\n if (!areThemesEqual(newRenderOptions.theme, this.renderOptions.theme)) {\n if (hasResolvedThemes(themeNames)) {\n resolvedThemes = getResolvedThemes(themeNames);\n } else {\n resolvedThemes = await resolveThemes(themeNames);\n }\n }\n\n if (!isCurrentRequest()) {\n return;\n }\n\n if (this.highlighter != null) {\n attachResolvedThemes(resolvedThemes, this.highlighter);\n } else {\n const highlighter = await getSharedHighlighter({\n themes: themeNames,\n langs: ['text'],\n preferredHighlighter: this.preferredHighlighter,\n });\n if (!isCurrentRequest()) {\n return;\n }\n this.highlighter = highlighter;\n }\n\n const workerSetup = this.setRenderOptionsOnWorkers(\n newRenderOptions,\n resolvedThemes\n );\n\n this.renderOptions = newRenderOptions;\n this.renderOptionsVersion++;\n this.diffCache.clear();\n this.fileCache.clear();\n this.invalidateRenderTasks();\n\n for (const instance of this.themeSubscribers) {\n instance.onThemeChange();\n }\n\n await workerSetup;\n } catch (error) {\n if (error instanceof WorkerPoolTerminatedError || !isCurrentRequest()) {\n return;\n }\n throw error;\n }\n }\n\n public getFileRenderOptions(): RenderFileOptions {\n const { tokenizeMaxLineLength, theme, useTokenTransformer } =\n this.renderOptions;\n return { theme, useTokenTransformer, tokenizeMaxLineLength };\n }\n\n public getDiffRenderOptions(): RenderDiffOptions {\n return { ...this.renderOptions };\n }\n\n private async setRenderOptionsOnWorkers(\n renderOptions: WorkerRenderingOptions,\n resolvedThemes: ThemeRegistrationResolved[]\n ): Promise<void> {\n if (this.workersFailed) {\n return;\n }\n if (!this.isInitialized()) {\n await this.initialize();\n }\n const taskPromises: Promise<void>[] = [];\n for (const managedWorker of this.workers) {\n if (!managedWorker.initialized) {\n console.log({ managedWorker });\n throw new Error(\n 'setRenderOptionsOnWorkers: Somehow we have an uninitialized worker'\n );\n }\n taskPromises.push(\n new Promise<void>((resolve, reject) => {\n const id = this.generateRequestId();\n const task: SetRenderOptionsWorkerTask = {\n type: 'set-render-options',\n id,\n request: {\n type: 'set-render-options',\n id,\n renderOptions,\n resolvedThemes,\n },\n resolve,\n reject,\n requestStart: Date.now(),\n };\n // Render-option updates are posted immediately, but the worker stays\n // unavailable for new render work until it acknowledges this message.\n this.activeTaskById.set(id, task);\n managedWorker.pendingSetupRequestId = id;\n managedWorker.worker.postMessage(task.request);\n })\n );\n }\n await Promise.all(taskPromises);\n }\n\n public subscribeToThemeChanges(instance: ThemeSubscriber): () => void {\n this.themeSubscribers.add(instance);\n this.queueBroadcastStateChanges();\n return () => {\n this.unsubscribeToThemeChanges(instance);\n this.queueBroadcastStateChanges();\n };\n }\n\n public unsubscribeToThemeChanges(instance: ThemeSubscriber): void {\n this.themeSubscribers.delete(instance);\n this.queueBroadcastStateChanges();\n }\n\n public subscribeToStatChanges(\n callback: (stats: WorkerStats) => unknown\n ): () => void {\n this.statSubscribers.add(callback);\n callback(this.getStats());\n return () => {\n this.statSubscribers.delete(callback);\n };\n }\n\n private queueBroadcastStateChanges() {\n if (this._queuedBroadcast != null) return;\n this._queuedBroadcast = requestAnimationFrame(this._broadcastStateChanges);\n }\n\n private _broadcastStateChanges = () => {\n if (this._queuedBroadcast != null) {\n cancelAnimationFrame(this._queuedBroadcast);\n this._queuedBroadcast = undefined;\n }\n const stats = this.getStats();\n for (const callback of this.statSubscribers) {\n callback(stats);\n }\n };\n\n public cleanUpTasks(instance: RenderTaskInstance): void {\n this.detachInstanceFromQueuedTasks(instance);\n const requestId = this.activeRequestByInstance.get(instance);\n if (requestId != null) {\n const task = this.activeTaskById.get(requestId);\n if (isRenderTask(task)) {\n this.detachInstanceFromRenderTask(task, instance);\n if (!task.primeCache && task.instances.size === 0) {\n this.removeActiveTask(task);\n }\n } else {\n this.activeTaskById.delete(requestId);\n }\n }\n this.activeRequestByInstance.delete(instance);\n this.queueBroadcastStateChanges();\n }\n\n public isInitialized(): boolean {\n return this.initialized === true;\n }\n\n public async initialize(languages: SupportedLanguages[] = []): Promise<void> {\n if (this.initialized === true) {\n return;\n } else if (this.initialized === false) {\n const { lifecycleGeneration } = this;\n this.initialized = new Promise((resolve, reject) => {\n void (async () => {\n try {\n const themes = getThemes(this.renderOptions.theme);\n let resolvedThemes: ThemeRegistrationResolved[] = [];\n if (hasResolvedThemes(themes)) {\n resolvedThemes = getResolvedThemes(themes);\n } else {\n resolvedThemes = await resolveThemes(themes);\n }\n if (!this.isCurrentLifecycle(lifecycleGeneration)) {\n resolve();\n return;\n }\n\n let resolvedLanguages: ResolvedLanguage[] = [];\n if (hasResolvedLanguages(languages)) {\n resolvedLanguages = getResolvedLanguages(languages);\n } else {\n resolvedLanguages = await resolveLanguages(languages);\n }\n if (!this.isCurrentLifecycle(lifecycleGeneration)) {\n resolve();\n return;\n }\n\n const [highlighter] = await Promise.all([\n getSharedHighlighter({\n themes,\n langs: ['text', ...languages],\n preferredHighlighter: this.preferredHighlighter,\n }),\n this.initializeWorkers(resolvedThemes, resolvedLanguages),\n ]);\n\n if (!this.isCurrentLifecycle(lifecycleGeneration)) {\n this.terminateWorkers();\n resolve();\n return;\n }\n this.highlighter = highlighter;\n this.initialized = true;\n this.diffCache.clear();\n this.fileCache.clear();\n this.drainQueue();\n this.queueBroadcastStateChanges();\n resolve();\n } catch (e) {\n if (\n e instanceof WorkerPoolTerminatedError ||\n !this.isCurrentLifecycle(lifecycleGeneration)\n ) {\n resolve();\n return;\n }\n this.initialized = false;\n this.workersFailed = true;\n this.queueBroadcastStateChanges();\n reject(e);\n }\n })();\n });\n this.queueBroadcastStateChanges();\n } else {\n return this.initialized;\n }\n }\n\n private async initializeWorkers(\n resolvedThemes: ThemeRegistrationResolved[],\n resolvedLanguages: ResolvedLanguage[]\n ): Promise<void> {\n this.workersFailed = false;\n const initPromises: Promise<unknown>[] = [];\n const customExtensionVersion = getCustomExtensionsVersion();\n const customExtensionMap =\n customExtensionVersion > 0 ? getCustomExtensionsMap() : undefined;\n if (this.workers.length > 0) {\n this.terminateWorkers();\n }\n for (let i = 0; i < (this.options.poolSize ?? 8); i++) {\n const worker = this.options.workerFactory();\n const managedWorker: ManagedWorker = {\n worker,\n requestId: undefined,\n pendingSetupRequestId: undefined,\n initialized: false,\n langs: new Set(['text', ...resolvedLanguages.map(({ name }) => name)]),\n customExtensionsVersion: 0,\n };\n worker.addEventListener(\n 'message',\n (event: MessageEvent<WorkerResponse>) => {\n this.handleWorkerMessage(managedWorker, event.data);\n }\n );\n worker.addEventListener('error', (error) =>\n console.error('Worker error:', error, managedWorker)\n );\n this.workers.push(managedWorker);\n initPromises.push(\n new Promise<void>((resolve, reject) => {\n const id = this.generateRequestId();\n const task: InitializeWorkerTask = {\n type: 'initialize',\n id,\n request: {\n type: 'initialize',\n id,\n renderOptions: this.renderOptions,\n preferredHighlighter: this.preferredHighlighter,\n resolvedThemes,\n resolvedLanguages,\n customExtensionsVersion:\n customExtensionMap != null ? customExtensionVersion : undefined,\n customExtensionMap,\n },\n resolve() {\n managedWorker.initialized = true;\n resolve();\n },\n reject,\n requestStart: Date.now(),\n };\n this.activeTaskById.set(id, task);\n this.executeTask(managedWorker, task);\n })\n );\n }\n await Promise.all(initPromises);\n }\n\n private drainQueue = () => {\n this._queuedDrain = undefined;\n // If we are initializing or things got cancelled while initializing, we\n // should not attempt to drain the queue\n if (this.initialized !== true || this.queuedTasks.length === 0) {\n return;\n }\n for (let i = 0; i < this.queuedTasks.length; ) {\n const task = this.queuedTasks[i];\n // If any instance has a request in progress, we should wait for it to\n // finish before starting work that would notify that instance.\n if (this.hasActiveRequest(task)) {\n i++;\n continue;\n }\n const langs = getLangsFromTask(task);\n const availableWorker = this.getAvailableWorker(langs);\n if (availableWorker == null) {\n break;\n }\n this.queuedTasks.splice(i, 1);\n this.assignWorkerToTask(task, availableWorker);\n void this.resolveLanguagesAndExecuteTask(availableWorker, task, langs);\n }\n this.queueBroadcastStateChanges();\n };\n\n public highlightFileAST(\n instance: FileRendererInstance,\n file: FileContents\n ): void {\n const cachedResult = this.getFileResultCache(file);\n // If we've already highlighted the file or it's plain text, we should not\n // attempt to highlight. This should be mostly never hit, but it's just an\n // extra level of safety\n if (\n isFilePlainText(file) ||\n (cachedResult != null &&\n areFileRenderOptionsEqual(\n cachedResult.options,\n this.getFileRenderOptions()\n ))\n ) {\n return;\n }\n if (!this.hasMatchingFileInstanceTask(instance, file)) {\n this.submitTask(instance, { type: 'file', file });\n }\n }\n\n public primeFileHighlightCache(file: FileContents): void {\n if (file.cacheKey == null) {\n console.warn(\n `WorkerPoolManager.primeFileHighlightCache: priming highlight cache requires file.cacheKey; skipping \"${file.name}\".`\n );\n return;\n }\n const cachedResult = this.getFileResultCache(file);\n const highlightKey = this.getFileHighlightKey(file);\n if (\n highlightKey == null ||\n isFilePlainText(file) ||\n (cachedResult != null &&\n areFileRenderOptionsEqual(\n cachedResult.options,\n this.getFileRenderOptions()\n ))\n ) {\n return;\n }\n const existingTask = this.getTaskByHighlightKey(highlightKey);\n if (existingTask != null) {\n existingTask.primeCache = true;\n } else {\n this.submitCacheTask({ type: 'file', file }, highlightKey);\n }\n }\n\n public getPlainFileAST(\n file: FileContents,\n startingLine: number,\n totalLines: number,\n lines?: string[]\n ): ThemedFileResult | undefined {\n if (this.highlighter == null) {\n this.queueInitialization();\n return undefined;\n }\n return renderFileWithHighlighter(\n file,\n this.highlighter,\n this.renderOptions,\n { forcePlainText: true, startingLine, totalLines, lines }\n );\n }\n\n public highlightDiffAST(\n instance: DiffRendererInstance,\n diff: FileDiffMetadata\n ): void {\n const cachedResult = this.getDiffResultCache(diff);\n // If we've already highlighted the diff or it's plain text, we should not\n // attempt to highlight. This should be mostly never hit, but it's just an\n // extra level of safety\n if (\n isDiffPlainText(diff) ||\n (cachedResult != null &&\n areDiffRenderOptionsEqual(\n cachedResult.options,\n this.getDiffRenderOptions()\n ))\n ) {\n return;\n }\n if (!this.hasMatchingDiffInstanceTask(instance, diff)) {\n this.submitTask(instance, { type: 'diff', diff });\n }\n }\n\n public primeDiffHighlightCache(diff: FileDiffMetadata): void {\n if (diff.cacheKey == null) {\n console.warn(\n `WorkerPoolManager.primeDiffHighlightCache: priming highlight cache requires diff.cacheKey; skipping \"${diff.prevName ?? diff.name}\" -> \"${diff.name}\".`\n );\n return;\n }\n const cachedResult = this.getDiffResultCache(diff);\n const highlightKey = this.getDiffHighlightKey(diff);\n if (\n highlightKey == null ||\n isDiffPlainText(diff) ||\n (cachedResult != null &&\n areDiffRenderOptionsEqual(\n cachedResult.options,\n this.getDiffRenderOptions()\n ))\n ) {\n return;\n }\n const existingTask = this.getTaskByHighlightKey(highlightKey);\n if (existingTask != null) {\n existingTask.primeCache = true;\n } else {\n this.submitCacheTask({ type: 'diff', diff }, highlightKey);\n }\n }\n\n public getPlainDiffAST(\n diff: FileDiffMetadata,\n startingLine: number,\n totalLines: number,\n expandedHunks?: Map<number, HunkExpansionRegion> | true,\n collapsedContextThreshold?: number\n ): ThemedDiffResult | undefined {\n return this.highlighter != null\n ? renderDiffWithHighlighter(diff, this.highlighter, this.renderOptions, {\n forcePlainText: true,\n startingLine,\n totalLines,\n expandedHunks,\n collapsedContextThreshold,\n })\n : undefined;\n }\n\n public terminate(): void {\n this.lifecycleGeneration++;\n this.cancelActiveWorkerTasks();\n this.terminateWorkers();\n this.fileCache.clear();\n this.diffCache.clear();\n this.activeRequestByInstance.clear();\n this.queuedTasks.length = 0;\n this.queuedTaskByInstance.clear();\n this.taskByHighlightKey.clear();\n this.activeTaskById.clear();\n this.highlighter = undefined;\n this.initialized = false;\n this.workersFailed = false;\n this.queueBroadcastStateChanges();\n }\n\n private isCurrentLifecycle(lifecycleGeneration: number): boolean {\n return this.lifecycleGeneration === lifecycleGeneration;\n }\n\n private queueInitialization(languages?: SupportedLanguages[]): void {\n void this.initialize(languages).catch((error) => {\n console.error(error);\n });\n }\n\n private cancelActiveWorkerTasks(): void {\n const error = new WorkerPoolTerminatedError();\n for (const task of this.activeTaskById.values()) {\n if ('reject' in task) {\n task.reject(error);\n }\n }\n }\n\n private terminateWorkers() {\n for (const managedWorker of this.workers) {\n managedWorker.worker.terminate();\n }\n this.workers.length = 0;\n }\n\n public getStats(): WorkerStats {\n return {\n managerState: (() => {\n if (this.initialized === false) {\n return 'waiting';\n }\n if (this.initialized !== true) {\n return 'initializing';\n }\n return 'initialized';\n })(),\n totalWorkers: this.workers.length,\n workersFailed: this.workersFailed,\n busyWorkers: this.workers.filter(\n (w) => w.requestId != null || w.pendingSetupRequestId != null\n ).length,\n queuedTasks: this.queuedTasks.length,\n activeTasks: this.activeTaskById.size,\n themeSubscribers: this.themeSubscribers.size,\n fileCacheSize: this.fileCache.size,\n diffCacheSize: this.diffCache.size,\n };\n }\n\n private submitTask(\n instance: FileRendererInstance,\n request: Omit<RenderFileRequest, 'id'>\n ): void;\n private submitTask(\n instance: DiffRendererInstance,\n request: Omit<RenderDiffRequest, 'id'>\n ): void;\n private submitTask(\n instance: FileRendererInstance | DiffRendererInstance,\n request: SubmitRequest\n ): void {\n if (this.initialized === false) {\n this.queueInitialization();\n }\n\n const highlightKey = this.getHighlightKeyForRequest(request);\n const existingTask =\n highlightKey != null\n ? this.getTaskByHighlightKey(highlightKey)\n : undefined;\n if (existingTask != null) {\n this.detachInstanceFromQueuedTasks(instance, existingTask);\n this.addInstanceToTask(existingTask, instance);\n this.queueBroadcastStateChanges();\n return;\n }\n\n this.detachInstanceFromQueuedTasks(instance);\n const id = this.generateRequestId();\n const requestStart = Date.now();\n const { renderOptionsVersion } = this;\n const task: RenderTask = (() => {\n switch (request.type) {\n case 'file':\n return {\n type: 'file',\n id,\n request: { ...request, id },\n instances: new Set([instance as FileRendererInstance]),\n primeCache: false,\n highlightKey,\n renderOptionsVersion,\n requestStart,\n };\n case 'diff':\n return {\n type: 'diff',\n id,\n request: { ...request, id },\n instances: new Set([instance as DiffRendererInstance]),\n primeCache: false,\n highlightKey,\n renderOptionsVersion,\n requestStart,\n };\n }\n })();\n this.enqueueRenderTask(task, instance);\n }\n\n private submitCacheTask(request: SubmitRequest, highlightKey: string): void {\n if (this.initialized === false) {\n this.queueInitialization();\n }\n const id = this.generateRequestId();\n const requestStart = Date.now();\n const { renderOptionsVersion } = this;\n const task: RenderTask = (() => {\n switch (request.type) {\n case 'file':\n return {\n type: 'file',\n id,\n request: { ...request, id },\n instances: new Set<FileRendererInstance>(),\n primeCache: true,\n highlightKey,\n renderOptionsVersion,\n requestStart,\n };\n case 'diff':\n return {\n type: 'diff',\n id,\n request: { ...request, id },\n instances: new Set<DiffRendererInstance>(),\n primeCache: true,\n highlightKey,\n renderOptionsVersion,\n requestStart,\n };\n }\n })();\n this.enqueueRenderTask(task);\n }\n\n private enqueueRenderTask(\n task: RenderTask,\n instance?: RenderTaskInstance\n ): void {\n this.queuedTasks.push(task);\n if (instance != null) {\n this.queuedTaskByInstance.set(instance, task);\n }\n if (task.highlightKey != null) {\n this.taskByHighlightKey.set(task.highlightKey, task);\n }\n this.queueDrain();\n }\n\n private async resolveLanguagesAndExecuteTask(\n availableWorker: ManagedWorker,\n task: RenderFileTask | RenderDiffTask,\n langs: SupportedLanguages[]\n ): Promise<void> {\n try {\n // Add resolved languages if required\n const workerMissingLangs = langs.filter(\n (lang) => !availableWorker.langs.has(lang)\n );\n\n if (workerMissingLangs.length > 0) {\n if (hasResolvedLanguages(workerMissingLangs)) {\n task.request.resolvedLanguages =\n getResolvedLanguages(workerMissingLangs);\n } else {\n task.request.resolvedLanguages =\n await resolveLanguages(workerMissingLangs);\n }\n }\n // If the task has been cleaned up after awaiting language resolving,\n // lets fully clean it up\n if (!this.activeTaskById.has(task.id)) {\n if (availableWorker.requestId === task.id) {\n this.cleanWorkerAndTask(availableWorker, task);\n this.queueBroadcastStateChanges();\n if (this.queuedTasks.length > 0) {\n this.queueDrain();\n }\n }\n return;\n }\n this.executeTask(availableWorker, task);\n } catch {\n this.cleanWorkerAndTask(availableWorker, task);\n this.queueBroadcastStateChanges();\n if (this.queuedTasks.length > 0) {\n this.queueDrain();\n }\n }\n }\n\n private handleWorkerMessage(\n managedWorker: ManagedWorker,\n response: WorkerResponse\n ): void {\n const task = this.activeTaskById.get(response.id);\n try {\n if (task == null) {\n // If we can't find a task for this response, it probably means the\n // component has been unmounted, so we should silently ignore it\n throw IGNORE_RESPONSE;\n } else if (response.type === 'error') {\n const error = new Error(response.error);\n if (response.stack) {\n error.stack = response.stack;\n }\n if ('reject' in task) {\n task.reject(error);\n } else if (isRenderTask(task)) {\n this.notifyHighlightError(task, error);\n } else {\n throw new Error('handleWorkerMessage: unknown task type');\n }\n throw error;\n } else {\n switch (response.requestType) {\n case 'initialize':\n if (task.type !== 'initialize') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n this.syncCustomExtensionVersion(managedWorker, task.request);\n task.resolve();\n break;\n case 'set-render-options':\n if (task.type !== 'set-render-options') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n task.resolve();\n break;\n case 'file': {\n if (task.type !== 'file') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n const { result, options } = response;\n if (\n !this.isCurrentRenderTask(task) ||\n !areFileRenderOptionsEqual(options, this.getFileRenderOptions())\n ) {\n throw IGNORE_RESPONSE;\n }\n const { request } = task;\n this.syncCustomExtensionVersion(managedWorker, request);\n if (request.file.cacheKey != null) {\n this.fileCache.set(request.file.cacheKey, { result, options });\n }\n this.notifyFileInstances(task, result, options);\n break;\n }\n case 'diff': {\n if (task.type !== 'diff') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n const { result, options } = response;\n if (\n !this.isCurrentRenderTask(task) ||\n !areDiffRenderOptionsEqual(options, this.getDiffRenderOptions())\n ) {\n throw IGNORE_RESPONSE;\n }\n const { request } = task;\n this.syncCustomExtensionVersion(managedWorker, request);\n if (request.diff.cacheKey != null) {\n this.diffCache.set(request.diff.cacheKey, { result, options });\n }\n this.notifyDiffInstances(task, result, options);\n break;\n }\n }\n }\n } catch (error) {\n if (error !== IGNORE_RESPONSE) {\n console.error(error, task, response);\n }\n }\n\n this.cleanWorkerAndTask(managedWorker, task, response.id);\n this.queueBroadcastStateChanges();\n if (this.queuedTasks.length > 0) {\n // We queue drain so that potentially multiple workers can free up\n // allowing for better language matches if possible\n this.queueDrain();\n }\n }\n\n private _queuedDrain: Promise<void> | undefined;\n private queueDrain() {\n if (this._queuedDrain != null) return;\n this._queuedDrain = Promise.resolve().then(this.drainQueue);\n this.queueBroadcastStateChanges();\n }\n\n private assignWorkerToTask(\n task: AllWorkerTasks,\n managedWorker: ManagedWorker\n ) {\n managedWorker.requestId = task.id;\n if (isRenderTask(task)) {\n this.clearQueuedInstanceRequests(task);\n this.trackInstanceRequests(task);\n }\n this.activeTaskById.set(task.id, task);\n }\n\n private cleanWorkerAndTask(\n managedWorker: ManagedWorker,\n task?: AllWorkerTasks,\n requestId: WorkerRequestId | undefined = task?.id\n ) {\n if (managedWorker.requestId === requestId) {\n managedWorker.requestId = undefined;\n }\n if (managedWorker.pendingSetupRequestId === requestId) {\n managedWorker.pendingSetupRequestId = undefined;\n }\n if (task != null) {\n if (isRenderTask(task)) {\n this.clearInstanceRequests(task);\n this.clearHighlightKey(task);\n }\n this.activeTaskById.delete(task.id);\n }\n }\n\n private executeTask(\n managedWorker: ManagedWorker,\n task: AllWorkerTasks\n ): void {\n if (shouldSyncCustomExtensions(task.request)) {\n this.maybeAttachCustomExtensions(managedWorker, task.request);\n }\n if (!this.activeTaskById.has(task.id)) {\n this.assignWorkerToTask(task, managedWorker);\n }\n for (const lang of getLangsFromTask(task)) {\n managedWorker.langs.add(lang);\n }\n try {\n managedWorker.worker.postMessage(task.request);\n } catch (error) {\n console.error('Failed to post message to worker:', error);\n if (isRenderTask(task)) {\n this.notifyHighlightError(task, error);\n } else if ('reject' in task) {\n task.reject(error as Error);\n }\n this.cleanWorkerAndTask(managedWorker, task);\n if (this.queuedTasks.length > 0) {\n this.queueDrain();\n }\n }\n this.queueBroadcastStateChanges();\n }\n\n private maybeAttachCustomExtensions(\n managedWorker: ManagedWorker,\n request: InitializeWorkerRequest | RenderFileRequest | RenderDiffRequest\n ): void {\n if (request.customExtensionsVersion != null) {\n return;\n }\n const version = getCustomExtensionsVersion();\n if (managedWorker.customExtensionsVersion >= version) {\n return;\n }\n request.customExtensionsVersion = version;\n request.customExtensionMap = getCustomExtensionsMap();\n }\n\n private syncCustomExtensionVersion(\n managedWorker: ManagedWorker,\n request: InitializeWorkerRequest | RenderFileRequest | RenderDiffRequest\n ): void {\n if (request.customExtensionsVersion == null) {\n return;\n }\n managedWorker.customExtensionsVersion = request.customExtensionsVersion;\n }\n\n private getAvailableWorker(\n langs: SupportedLanguages[]\n ): ManagedWorker | undefined {\n let worker: ManagedWorker | undefined;\n for (const managedWorker of this.workers) {\n if (\n managedWorker.requestId != null ||\n managedWorker.pendingSetupRequestId != null ||\n !managedWorker.initialized\n ) {\n continue;\n }\n worker = managedWorker;\n if (langs.length === 0) {\n break;\n }\n let hasEveryLang = true;\n for (const lang of langs) {\n if (!managedWorker.langs.has(lang)) {\n hasEveryLang = false;\n break;\n }\n }\n if (hasEveryLang) {\n break;\n }\n }\n return worker;\n }\n\n private getFileHighlightKey(file: FileContents): string | undefined {\n if (file.cacheKey == null) {\n return undefined;\n }\n return `file:${file.cacheKey}:${this.renderOptionsVersion}`;\n }\n\n private getDiffHighlightKey(diff: FileDiffMetadata): string | undefined {\n if (diff.cacheKey == null) {\n return undefined;\n }\n return `diff:${diff.cacheKey}:${this.renderOptionsVersion}`;\n }\n\n private getHighlightKeyForRequest(\n request: SubmitRequest\n ): string | undefined {\n switch (request.type) {\n case 'file':\n return this.getFileHighlightKey(request.file);\n case 'diff':\n return this.getDiffHighlightKey(request.diff);\n }\n }\n\n private hasActiveRequest(task: RenderTask): boolean {\n for (const instance of getInstances(task)) {\n if (this.activeRequestByInstance.has(instance)) {\n return true;\n }\n }\n return false;\n }\n\n private addInstanceToTask(\n task: RenderTask,\n instance: FileRendererInstance | DiffRendererInstance\n ): void {\n if (task.type === 'file') {\n task.instances.add(instance as FileRendererInstance);\n } else {\n task.instances.add(instance as DiffRendererInstance);\n }\n if (this.activeTaskById.has(task.id)) {\n this.activeRequestByInstance.set(instance, task.id);\n } else {\n this.queuedTaskByInstance.set(instance, task);\n }\n }\n\n private detachInstanceFromQueuedTasks(\n instance: RenderTaskInstance,\n exceptTask?: RenderTask\n ): void {\n const task = this.queuedTaskByInstance.get(instance);\n if (task == null || task === exceptTask) {\n return;\n }\n this.queuedTaskByInstance.delete(instance);\n this.detachInstanceFromRenderTask(task, instance);\n if (!task.primeCache && task.instances.size === 0) {\n this.removeQueuedTask(task);\n }\n }\n\n private detachInstanceFromRenderTask(\n task: RenderTask,\n instance: RenderTaskInstance\n ): void {\n if (task.type === 'file') {\n task.instances.delete(instance as FileRendererInstance);\n } else {\n task.instances.delete(instance as DiffRendererInstance);\n }\n }\n\n private removeQueuedTask(task: RenderTask): void {\n const index = this.queuedTasks.indexOf(task);\n if (index !== -1) {\n this.queuedTasks.splice(index, 1);\n }\n this.clearQueuedInstanceRequests(task);\n this.clearHighlightKey(task);\n }\n\n private removeActiveTask(task: RenderTask): void {\n this.clearInstanceRequests(task);\n this.clearHighlightKey(task);\n this.activeTaskById.delete(task.id);\n }\n\n private invalidateRenderTasks(): void {\n for (let index = this.queuedTasks.length - 1; index >= 0; index--) {\n const task = this.queuedTasks[index];\n if (task.renderOptionsVersion !== this.renderOptionsVersion) {\n this.removeQueuedTask(task);\n }\n }\n\n for (const task of Array.from(this.activeTaskById.values())) {\n if (\n isRenderTask(task) &&\n task.renderOptionsVersion !== this.renderOptionsVersion\n ) {\n this.removeActiveTask(task);\n }\n }\n }\n\n private clearQueuedInstanceRequests(task: RenderTask): void {\n for (const instance of getInstances(task)) {\n if (this.queuedTaskByInstance.get(instance) === task) {\n this.queuedTaskByInstance.delete(instance);\n }\n }\n }\n\n private clearHighlightKey(task: RenderTask): void {\n if (\n task.highlightKey != null &&\n this.taskByHighlightKey.get(task.highlightKey) === task\n ) {\n this.taskByHighlightKey.delete(task.highlightKey);\n }\n }\n\n private trackInstanceRequests(task: RenderTask): void {\n for (const instance of getInstances(task)) {\n this.activeRequestByInstance.set(instance, task.id);\n }\n }\n\n private clearInstanceRequests(task: RenderTask): void {\n for (const instance of getInstances(task)) {\n if (this.activeRequestByInstance.get(instance) === task.id) {\n this.activeRequestByInstance.delete(instance);\n }\n }\n }\n\n private notifyFileInstances(\n task: RenderFileTask,\n result: ThemedFileResult,\n options: RenderFileOptions\n ): void {\n for (const instance of task.instances) {\n if (this.activeRequestByInstance.get(instance) === task.id) {\n instance.onHighlightSuccess(task.request.file, result, options);\n }\n }\n }\n\n private notifyDiffInstances(\n task: RenderDiffTask,\n result: ThemedDiffResult,\n options: RenderDiffOptions\n ): void {\n for (const instance of task.instances) {\n if (this.activeRequestByInstance.get(instance) === task.id) {\n instance.onHighlightSuccess(task.request.diff, result, options);\n }\n }\n }\n\n private notifyHighlightError(task: RenderTask, error: unknown): void {\n for (const instance of getInstances(task)) {\n if (this.activeRequestByInstance.get(instance) === task.id) {\n instance.onHighlightError(error);\n }\n }\n }\n\n private hasMatchingFileInstanceTask(\n instance: FileRendererInstance,\n file: FileContents\n ): boolean {\n for (const task of this.iterateRenderTasks()) {\n if (\n task.type === 'file' &&\n this.isCurrentRenderTask(task) &&\n task.instances.has(instance) &&\n areFilesEqual(file, task.request.file)\n ) {\n return true;\n }\n }\n return false;\n }\n\n private hasMatchingDiffInstanceTask(\n instance: DiffRendererInstance,\n diff: FileDiffMetadata\n ): boolean {\n for (const task of this.iterateRenderTasks()) {\n if (\n task.type === 'diff' &&\n this.isCurrentRenderTask(task) &&\n task.instances.has(instance) &&\n areDiffTargetsEqual(task.request.diff, diff)\n ) {\n return true;\n }\n }\n return false;\n }\n\n private getTaskByHighlightKey(highlightKey: string): RenderTask | undefined {\n const task = this.taskByHighlightKey.get(highlightKey);\n return task != null && this.isCurrentRenderTask(task) ? task : undefined;\n }\n\n private isCurrentRenderTask(task: RenderTask): boolean {\n return task.renderOptionsVersion === this.renderOptionsVersion;\n }\n\n private *iterateRenderTasks(): Generator<RenderTask> {\n for (const task of this.queuedTasks) {\n yield task;\n }\n for (const task of this.activeTaskById.values()) {\n if (isRenderTask(task)) {\n yield task;\n }\n }\n }\n\n private generateRequestId(): WorkerRequestId {\n return `req_${++this.nextRequestId}`;\n }\n}\n\nfunction shouldSyncCustomExtensions(\n request: AllWorkerTasks['request']\n): request is InitializeWorkerRequest | RenderFileRequest | RenderDiffRequest {\n return (\n request.type === 'initialize' ||\n request.type === 'file' ||\n request.type === 'diff'\n );\n}\n\nfunction getLangsFromTask(task: AllWorkerTasks): SupportedLanguages[] {\n const langs = new Set<SupportedLanguages>();\n if (task.type === 'initialize' || task.type === 'set-render-options') {\n return [];\n }\n switch (task.type) {\n case 'file': {\n langs.add(\n task.request.file.lang ??\n getFiletypeFromFileName(task.request.file.name)\n );\n break;\n }\n case 'diff': {\n langs.add(\n task.request.diff.lang ??\n getFiletypeFromFileName(task.request.diff.name)\n );\n langs.add(\n task.request.diff.lang ??\n getFiletypeFromFileName(task.request.diff.prevName ?? '-')\n );\n break;\n }\n }\n langs.delete('text');\n return Array.from(langs);\n}\n\nfunction isRenderTask(task: AllWorkerTasks | undefined): task is RenderTask {\n return task?.type === 'file' || task?.type === 'diff';\n}\n\nfunction getInstances(\n task: RenderTask\n): Set<FileRendererInstance | DiffRendererInstance> {\n return task.instances as Set<FileRendererInstance | DiffRendererInstance>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"WorkerPoolManager.js","names":["options: WorkerPoolOptions","newRenderOptions: WorkerRenderingOptions","resolvedThemes: ThemeRegistrationResolved[]","taskPromises: Promise<void>[]","task: SetRenderOptionsWorkerTask","resolvedLanguages: ResolvedLanguage[]","initPromises: Promise<unknown>[]","managedWorker: ManagedWorker","task: InitializeWorkerTask","task: RenderTask","worker: ManagedWorker | undefined"],"sources":["../../src/worker/WorkerPoolManager.ts"],"sourcesContent":["import LRUMapPkg from 'lru_map';\n\nimport { DEFAULT_THEMES } from '../constants';\nimport { getResolvedLanguages } from '../highlighter/languages/getResolvedLanguages';\nimport { hasResolvedLanguages } from '../highlighter/languages/hasResolvedLanguages';\nimport { resolveLanguages } from '../highlighter/languages/resolveLanguages';\nimport { getSharedHighlighter } from '../highlighter/shared_highlighter';\nimport { attachResolvedThemes } from '../highlighter/themes/attachResolvedThemes';\nimport { getResolvedThemes } from '../highlighter/themes/getResolvedThemes';\nimport { hasResolvedThemes } from '../highlighter/themes/hasResolvedThemes';\nimport { resolveThemes } from '../highlighter/themes/resolveThemes';\nimport type {\n DiffsHighlighter,\n FileContents,\n FileDiffMetadata,\n HighlighterTypes,\n HunkExpansionRegion,\n RenderDiffOptions,\n RenderDiffResult,\n RenderFileOptions,\n RenderFileResult,\n SupportedLanguages,\n ThemedDiffResult,\n ThemedFileResult,\n ThemeRegistrationResolved,\n} from '../types';\nimport { areDiffRenderOptionsEqual } from '../utils/areDiffRenderOptionsEqual';\nimport { areDiffTargetsEqual } from '../utils/areDiffTargetsEqual';\nimport { areFileRenderOptionsEqual } from '../utils/areFileRenderOptionsEqual';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport {\n getCustomExtensionsMap,\n getCustomExtensionsVersion,\n getFiletypeFromFileName,\n} from '../utils/getFiletypeFromFileName';\nimport { getThemes } from '../utils/getThemes';\nimport { isDiffPlainText } from '../utils/isDiffPlainText';\nimport { isFilePlainText } from '../utils/isFilePlainText';\nimport { renderDiffWithHighlighter } from '../utils/renderDiffWithHighlighter';\nimport { renderFileWithHighlighter } from '../utils/renderFileWithHighlighter';\nimport type {\n AllWorkerTasks,\n DiffRendererInstance,\n FileRendererInstance,\n InitializeWorkerRequest,\n InitializeWorkerTask,\n RenderDiffRequest,\n RenderDiffTask,\n RenderFileRequest,\n RenderFileTask,\n ResolvedLanguage,\n SetRenderOptionsWorkerTask,\n SubmitRequest,\n WorkerInitializationRenderOptions,\n WorkerPoolOptions,\n WorkerRenderingOptions,\n WorkerRequestId,\n WorkerResponse,\n WorkerStats,\n} from './types';\n\nconst IGNORE_RESPONSE = Symbol('IGNORE_RESPONSE');\n\nclass WorkerPoolTerminatedError extends Error {\n constructor() {\n super('WorkerPoolManager: operation canceled because the pool terminated');\n }\n}\n\ninterface GetCachesResult {\n fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n}\n\ninterface ManagedWorker {\n worker: Worker;\n requestId: string | undefined;\n pendingSetupRequestId: WorkerRequestId | undefined;\n initialized: boolean;\n langs: Set<SupportedLanguages>;\n customExtensionsVersion: number;\n}\n\ninterface ThemeSubscriber {\n onThemeChange(): void;\n}\n\ntype RenderTask = RenderFileTask | RenderDiffTask;\n\ntype RenderTaskInstance = FileRendererInstance | DiffRendererInstance;\n\nexport class WorkerPoolManager {\n private highlighter: DiffsHighlighter | undefined;\n private readonly preferredHighlighter: HighlighterTypes;\n private renderOptions: WorkerRenderingOptions;\n private renderOptionsRequestVersion = 0;\n private renderOptionsVersion = 0;\n private initialized: Promise<void> | boolean = false;\n private workers: ManagedWorker[] = [];\n // Tasks that are waiting to get processed by a worker\n private queuedTasks: RenderTask[] = [];\n private queuedTaskByInstance = new Map<RenderTaskInstance, RenderTask>();\n\n // Tasks that map to highlightKey are essentially singular, so we only\n // need one map to include queued and active\n private taskByHighlightKey = new Map<string, RenderTask>();\n\n // Tasks that have already been sent to a worker and are awaiting a response.\n private activeTaskById = new Map<WorkerRequestId, AllWorkerTasks>();\n private activeRequestByInstance = new Map<\n RenderTaskInstance,\n WorkerRequestId\n >();\n\n private nextRequestId = 0;\n private themeSubscribers = new Set<ThemeSubscriber>();\n private workersFailed = false;\n private statSubscribers = new Set<(stats: WorkerStats) => unknown>();\n private fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n private diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n private _queuedBroadcast: number | undefined;\n // Incremented on terminate so async lifecycle work can identify stale results.\n private lifecycleGeneration = 0;\n\n constructor(\n private options: WorkerPoolOptions,\n {\n langs,\n theme = DEFAULT_THEMES,\n useTokenTransformer = false,\n lineDiffType = 'word-alt',\n maxLineDiffLength = 1000,\n tokenizeMaxLineLength = 1000,\n preferredHighlighter = 'shiki-js',\n }: WorkerInitializationRenderOptions\n ) {\n this.preferredHighlighter = preferredHighlighter;\n this.renderOptions = {\n theme,\n useTokenTransformer,\n lineDiffType,\n maxLineDiffLength,\n tokenizeMaxLineLength,\n };\n this.fileCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);\n this.diffCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);\n this.queueInitialization(langs);\n }\n\n public isWorkingPool(): boolean {\n return !this.workersFailed;\n }\n\n public getFileResultCache(file: FileContents): RenderFileResult | undefined {\n return file.cacheKey != null\n ? this.fileCache.get(file.cacheKey)\n : undefined;\n }\n\n public getDiffResultCache(\n diff: FileDiffMetadata\n ): RenderDiffResult | undefined {\n return diff.cacheKey != null\n ? this.diffCache.get(diff.cacheKey)\n : undefined;\n }\n\n public inspectCaches(): GetCachesResult {\n const { fileCache, diffCache } = this;\n return { fileCache, diffCache };\n }\n\n public evictFileFromCache(cacheKey: string): boolean {\n try {\n return this.fileCache.delete(cacheKey) !== undefined;\n } finally {\n this.queueBroadcastStateChanges();\n }\n }\n\n public evictDiffFromCache(cacheKey: string): boolean {\n try {\n return this.diffCache.delete(cacheKey) !== undefined;\n } finally {\n this.queueBroadcastStateChanges();\n }\n }\n\n async setRenderOptions({\n theme = this.renderOptions.theme ?? DEFAULT_THEMES,\n useTokenTransformer = this.renderOptions.useTokenTransformer ?? false,\n lineDiffType = this.renderOptions.lineDiffType ?? 'word-alt',\n maxLineDiffLength = this.renderOptions.maxLineDiffLength ?? 1000,\n tokenizeMaxLineLength = this.renderOptions.tokenizeMaxLineLength ?? 1000,\n }: Partial<WorkerRenderingOptions>): Promise<void> {\n const { lifecycleGeneration } = this;\n const renderOptionsRequestVersion = ++this.renderOptionsRequestVersion;\n const isCurrentRequest = (): boolean =>\n this.isCurrentLifecycle(lifecycleGeneration) &&\n this.renderOptionsRequestVersion === renderOptionsRequestVersion;\n try {\n const newRenderOptions: WorkerRenderingOptions = {\n theme,\n useTokenTransformer,\n lineDiffType,\n maxLineDiffLength,\n tokenizeMaxLineLength,\n };\n if (!this.isInitialized()) {\n await this.initialize();\n }\n if (\n !isCurrentRequest() ||\n areDiffRenderOptionsEqual(newRenderOptions, this.renderOptions)\n ) {\n return;\n }\n\n const themeNames = getThemes(theme);\n let resolvedThemes: ThemeRegistrationResolved[] = [];\n if (!areThemesEqual(newRenderOptions.theme, this.renderOptions.theme)) {\n if (hasResolvedThemes(themeNames)) {\n resolvedThemes = getResolvedThemes(themeNames);\n } else {\n resolvedThemes = await resolveThemes(themeNames);\n }\n }\n\n if (!isCurrentRequest()) {\n return;\n }\n\n if (this.highlighter != null) {\n attachResolvedThemes(resolvedThemes, this.highlighter);\n } else {\n const highlighter = await getSharedHighlighter({\n themes: themeNames,\n langs: ['text'],\n preferredHighlighter: this.preferredHighlighter,\n });\n if (!isCurrentRequest()) {\n return;\n }\n this.highlighter = highlighter;\n }\n\n const workerSetup = this.setRenderOptionsOnWorkers(\n newRenderOptions,\n resolvedThemes\n );\n\n this.renderOptions = newRenderOptions;\n this.renderOptionsVersion++;\n this.diffCache.clear();\n this.fileCache.clear();\n this.invalidateRenderTasks();\n\n for (const instance of this.themeSubscribers) {\n instance.onThemeChange();\n }\n\n await workerSetup;\n } catch (error) {\n if (error instanceof WorkerPoolTerminatedError || !isCurrentRequest()) {\n return;\n }\n throw error;\n }\n }\n\n public getFileRenderOptions(): RenderFileOptions {\n const { tokenizeMaxLineLength, theme, useTokenTransformer } =\n this.renderOptions;\n return { theme, useTokenTransformer, tokenizeMaxLineLength };\n }\n\n public getDiffRenderOptions(): RenderDiffOptions {\n return { ...this.renderOptions };\n }\n\n private async setRenderOptionsOnWorkers(\n renderOptions: WorkerRenderingOptions,\n resolvedThemes: ThemeRegistrationResolved[]\n ): Promise<void> {\n if (this.workersFailed) {\n return;\n }\n if (!this.isInitialized()) {\n await this.initialize();\n }\n const taskPromises: Promise<void>[] = [];\n for (const managedWorker of this.workers) {\n if (!managedWorker.initialized) {\n console.log({ managedWorker });\n throw new Error(\n 'setRenderOptionsOnWorkers: Somehow we have an uninitialized worker'\n );\n }\n taskPromises.push(\n new Promise<void>((resolve, reject) => {\n const id = this.generateRequestId();\n const task: SetRenderOptionsWorkerTask = {\n type: 'set-render-options',\n id,\n request: {\n type: 'set-render-options',\n id,\n renderOptions,\n resolvedThemes,\n },\n resolve,\n reject,\n requestStart: Date.now(),\n };\n // Render-option updates are posted immediately, but the worker stays\n // unavailable for new render work until it acknowledges this message.\n this.activeTaskById.set(id, task);\n managedWorker.pendingSetupRequestId = id;\n managedWorker.worker.postMessage(task.request);\n })\n );\n }\n await Promise.all(taskPromises);\n }\n\n public subscribeToThemeChanges(instance: ThemeSubscriber): () => void {\n this.themeSubscribers.add(instance);\n this.queueBroadcastStateChanges();\n return () => {\n this.unsubscribeToThemeChanges(instance);\n this.queueBroadcastStateChanges();\n };\n }\n\n public unsubscribeToThemeChanges(instance: ThemeSubscriber): void {\n this.themeSubscribers.delete(instance);\n this.queueBroadcastStateChanges();\n }\n\n public subscribeToStatChanges(\n callback: (stats: WorkerStats) => unknown\n ): () => void {\n this.statSubscribers.add(callback);\n callback(this.getStats());\n return () => {\n this.statSubscribers.delete(callback);\n };\n }\n\n private queueBroadcastStateChanges() {\n if (this._queuedBroadcast != null) return;\n this._queuedBroadcast = requestAnimationFrame(this._broadcastStateChanges);\n }\n\n private _broadcastStateChanges = () => {\n if (this._queuedBroadcast != null) {\n cancelAnimationFrame(this._queuedBroadcast);\n this._queuedBroadcast = undefined;\n }\n const stats = this.getStats();\n for (const callback of this.statSubscribers) {\n callback(stats);\n }\n };\n\n public cleanUpTasks(instance: RenderTaskInstance): void {\n this.detachInstanceFromQueuedTasks(instance);\n const requestId = this.activeRequestByInstance.get(instance);\n if (requestId != null) {\n const task = this.activeTaskById.get(requestId);\n if (isRenderTask(task)) {\n this.detachInstanceFromRenderTask(task, instance);\n if (!task.primeCache && task.instances.size === 0) {\n this.removeActiveTask(task);\n }\n } else {\n this.activeTaskById.delete(requestId);\n }\n }\n this.activeRequestByInstance.delete(instance);\n this.queueBroadcastStateChanges();\n }\n\n public isInitialized(): boolean {\n return this.initialized === true;\n }\n\n public async initialize(languages: SupportedLanguages[] = []): Promise<void> {\n if (this.initialized === true) {\n return;\n } else if (this.initialized === false) {\n const { lifecycleGeneration } = this;\n this.initialized = new Promise((resolve, reject) => {\n void (async () => {\n try {\n const themes = getThemes(this.renderOptions.theme);\n let resolvedThemes: ThemeRegistrationResolved[] = [];\n if (hasResolvedThemes(themes)) {\n resolvedThemes = getResolvedThemes(themes);\n } else {\n resolvedThemes = await resolveThemes(themes);\n }\n if (!this.isCurrentLifecycle(lifecycleGeneration)) {\n resolve();\n return;\n }\n\n let resolvedLanguages: ResolvedLanguage[] = [];\n if (hasResolvedLanguages(languages)) {\n resolvedLanguages = getResolvedLanguages(languages);\n } else {\n resolvedLanguages = await resolveLanguages(languages);\n }\n if (!this.isCurrentLifecycle(lifecycleGeneration)) {\n resolve();\n return;\n }\n\n const [highlighter] = await Promise.all([\n getSharedHighlighter({\n themes,\n langs: ['text', ...languages],\n preferredHighlighter: this.preferredHighlighter,\n }),\n this.initializeWorkers(resolvedThemes, resolvedLanguages),\n ]);\n\n if (!this.isCurrentLifecycle(lifecycleGeneration)) {\n this.terminateWorkers();\n resolve();\n return;\n }\n this.highlighter = highlighter;\n this.initialized = true;\n this.diffCache.clear();\n this.fileCache.clear();\n this.drainQueue();\n this.queueBroadcastStateChanges();\n resolve();\n } catch (e) {\n if (\n e instanceof WorkerPoolTerminatedError ||\n !this.isCurrentLifecycle(lifecycleGeneration)\n ) {\n resolve();\n return;\n }\n this.initialized = false;\n this.workersFailed = true;\n this.queueBroadcastStateChanges();\n reject(e);\n }\n })();\n });\n this.queueBroadcastStateChanges();\n } else {\n return this.initialized;\n }\n }\n\n private async initializeWorkers(\n resolvedThemes: ThemeRegistrationResolved[],\n resolvedLanguages: ResolvedLanguage[]\n ): Promise<void> {\n this.workersFailed = false;\n const initPromises: Promise<unknown>[] = [];\n const customExtensionVersion = getCustomExtensionsVersion();\n const customExtensionMap =\n customExtensionVersion > 0 ? getCustomExtensionsMap() : undefined;\n if (this.workers.length > 0) {\n this.terminateWorkers();\n }\n for (let i = 0; i < (this.options.poolSize ?? 8); i++) {\n const worker = this.options.workerFactory();\n const managedWorker: ManagedWorker = {\n worker,\n requestId: undefined,\n pendingSetupRequestId: undefined,\n initialized: false,\n langs: new Set(['text', ...resolvedLanguages.map(({ name }) => name)]),\n customExtensionsVersion: 0,\n };\n worker.addEventListener(\n 'message',\n (event: MessageEvent<WorkerResponse>) => {\n this.handleWorkerMessage(managedWorker, event.data);\n }\n );\n worker.addEventListener('error', (error) =>\n console.error('Worker error:', error, managedWorker)\n );\n this.workers.push(managedWorker);\n initPromises.push(\n new Promise<void>((resolve, reject) => {\n const id = this.generateRequestId();\n const task: InitializeWorkerTask = {\n type: 'initialize',\n id,\n request: {\n type: 'initialize',\n id,\n renderOptions: this.renderOptions,\n preferredHighlighter: this.preferredHighlighter,\n resolvedThemes,\n resolvedLanguages,\n customExtensionsVersion:\n customExtensionMap != null ? customExtensionVersion : undefined,\n customExtensionMap,\n },\n resolve() {\n managedWorker.initialized = true;\n resolve();\n },\n reject,\n requestStart: Date.now(),\n };\n this.activeTaskById.set(id, task);\n this.executeTask(managedWorker, task);\n })\n );\n }\n await Promise.all(initPromises);\n }\n\n private drainQueue = () => {\n this._queuedDrain = undefined;\n // If we are initializing or things got cancelled while initializing, we\n // should not attempt to drain the queue\n if (this.initialized !== true || this.queuedTasks.length === 0) {\n return;\n }\n for (let i = 0; i < this.queuedTasks.length; ) {\n const task = this.queuedTasks[i];\n // If any instance has a request in progress, we should wait for it to\n // finish before starting work that would notify that instance.\n if (this.hasActiveRequest(task)) {\n i++;\n continue;\n }\n const langs = getLangsFromTask(task);\n const availableWorker = this.getAvailableWorker(langs);\n if (availableWorker == null) {\n break;\n }\n this.queuedTasks.splice(i, 1);\n this.assignWorkerToTask(task, availableWorker);\n void this.resolveLanguagesAndExecuteTask(availableWorker, task, langs);\n }\n this.queueBroadcastStateChanges();\n };\n\n public highlightFileAST(\n instance: FileRendererInstance,\n file: FileContents\n ): void {\n const cachedResult = this.getFileResultCache(file);\n // If we've already highlighted the file or it's plain text, we should not\n // attempt to highlight. This should be mostly never hit, but it's just an\n // extra level of safety\n if (\n isFilePlainText(file) ||\n (cachedResult != null &&\n areFileRenderOptionsEqual(\n cachedResult.options,\n this.getFileRenderOptions()\n ))\n ) {\n return;\n }\n if (!this.hasMatchingFileInstanceTask(instance, file)) {\n this.submitTask(instance, { type: 'file', file });\n }\n }\n\n public primeFileHighlightCache(file: FileContents): void {\n if (file.cacheKey == null) {\n console.warn(\n `WorkerPoolManager.primeFileHighlightCache: priming highlight cache requires file.cacheKey; skipping \"${file.name}\".`\n );\n return;\n }\n const cachedResult = this.getFileResultCache(file);\n const highlightKey = this.getFileHighlightKey(file);\n if (\n highlightKey == null ||\n isFilePlainText(file) ||\n (cachedResult != null &&\n areFileRenderOptionsEqual(\n cachedResult.options,\n this.getFileRenderOptions()\n ))\n ) {\n return;\n }\n const existingTask = this.getTaskByHighlightKey(highlightKey);\n if (existingTask != null) {\n existingTask.primeCache = true;\n } else {\n this.submitCacheTask({ type: 'file', file }, highlightKey);\n }\n }\n\n public getPlainFileAST(\n file: FileContents,\n startingLine: number,\n totalLines: number,\n lines?: string[]\n ): ThemedFileResult | undefined {\n if (this.highlighter == null) {\n this.queueInitialization();\n return undefined;\n }\n return renderFileWithHighlighter(\n file,\n this.highlighter,\n this.renderOptions,\n { forcePlainText: true, startingLine, totalLines, lines }\n );\n }\n\n public highlightDiffAST(\n instance: DiffRendererInstance,\n diff: FileDiffMetadata\n ): void {\n const cachedResult = this.getDiffResultCache(diff);\n // If we've already highlighted the diff or it's plain text, we should not\n // attempt to highlight. This should be mostly never hit, but it's just an\n // extra level of safety\n if (\n isDiffPlainText(diff) ||\n (cachedResult != null &&\n areDiffRenderOptionsEqual(\n cachedResult.options,\n this.getDiffRenderOptions()\n ))\n ) {\n return;\n }\n if (!this.hasMatchingDiffInstanceTask(instance, diff)) {\n this.submitTask(instance, { type: 'diff', diff });\n }\n }\n\n public primeDiffHighlightCache(diff: FileDiffMetadata): void {\n if (diff.cacheKey == null) {\n console.warn(\n `WorkerPoolManager.primeDiffHighlightCache: priming highlight cache requires diff.cacheKey; skipping \"${diff.prevName ?? diff.name}\" -> \"${diff.name}\".`\n );\n return;\n }\n const cachedResult = this.getDiffResultCache(diff);\n const highlightKey = this.getDiffHighlightKey(diff);\n if (\n highlightKey == null ||\n isDiffPlainText(diff) ||\n (cachedResult != null &&\n areDiffRenderOptionsEqual(\n cachedResult.options,\n this.getDiffRenderOptions()\n ))\n ) {\n return;\n }\n const existingTask = this.getTaskByHighlightKey(highlightKey);\n if (existingTask != null) {\n existingTask.primeCache = true;\n } else {\n this.submitCacheTask({ type: 'diff', diff }, highlightKey);\n }\n }\n\n public getPlainDiffAST(\n diff: FileDiffMetadata,\n startingLine: number,\n totalLines: number,\n expandedHunks?: Map<number, HunkExpansionRegion> | true,\n collapsedContextThreshold?: number\n ): ThemedDiffResult | undefined {\n return this.highlighter != null\n ? renderDiffWithHighlighter(diff, this.highlighter, this.renderOptions, {\n forcePlainText: true,\n startingLine,\n totalLines,\n expandedHunks,\n collapsedContextThreshold,\n })\n : undefined;\n }\n\n public terminate(): void {\n this.lifecycleGeneration++;\n this.cancelActiveWorkerTasks();\n this.terminateWorkers();\n this.fileCache.clear();\n this.diffCache.clear();\n this.activeRequestByInstance.clear();\n this.queuedTasks.length = 0;\n this.queuedTaskByInstance.clear();\n this.taskByHighlightKey.clear();\n this.activeTaskById.clear();\n this.highlighter = undefined;\n this.initialized = false;\n this.workersFailed = false;\n this.queueBroadcastStateChanges();\n }\n\n private isCurrentLifecycle(lifecycleGeneration: number): boolean {\n return this.lifecycleGeneration === lifecycleGeneration;\n }\n\n private queueInitialization(languages?: SupportedLanguages[]): void {\n void this.initialize(languages).catch((error) => {\n console.error(error);\n });\n }\n\n private cancelActiveWorkerTasks(): void {\n const error = new WorkerPoolTerminatedError();\n for (const task of this.activeTaskById.values()) {\n if ('reject' in task) {\n task.reject(error);\n }\n }\n }\n\n private terminateWorkers() {\n for (const managedWorker of this.workers) {\n managedWorker.worker.terminate();\n }\n this.workers.length = 0;\n }\n\n public getStats(): WorkerStats {\n return {\n managerState: (() => {\n if (this.initialized === false) {\n return 'waiting';\n }\n if (this.initialized !== true) {\n return 'initializing';\n }\n return 'initialized';\n })(),\n totalWorkers: this.workers.length,\n workersFailed: this.workersFailed,\n busyWorkers: this.workers.filter(\n (w) => w.requestId != null || w.pendingSetupRequestId != null\n ).length,\n queuedTasks: this.queuedTasks.length,\n activeTasks: this.activeTaskById.size,\n themeSubscribers: this.themeSubscribers.size,\n fileCacheSize: this.fileCache.size,\n diffCacheSize: this.diffCache.size,\n };\n }\n\n private submitTask(\n instance: FileRendererInstance,\n request: Omit<RenderFileRequest, 'id'>\n ): void;\n private submitTask(\n instance: DiffRendererInstance,\n request: Omit<RenderDiffRequest, 'id'>\n ): void;\n private submitTask(\n instance: FileRendererInstance | DiffRendererInstance,\n request: SubmitRequest\n ): void {\n if (this.initialized === false) {\n this.queueInitialization();\n }\n\n const highlightKey = this.getHighlightKeyForRequest(request);\n const existingTask =\n highlightKey != null\n ? this.getTaskByHighlightKey(highlightKey)\n : undefined;\n if (existingTask != null) {\n this.detachInstanceFromQueuedTasks(instance, existingTask);\n this.addInstanceToTask(existingTask, instance);\n this.queueBroadcastStateChanges();\n return;\n }\n\n this.detachInstanceFromQueuedTasks(instance);\n const id = this.generateRequestId();\n const requestStart = Date.now();\n const { renderOptionsVersion } = this;\n const task: RenderTask = (() => {\n switch (request.type) {\n case 'file':\n return {\n type: 'file',\n id,\n request: { ...request, id },\n instances: new Set([instance as FileRendererInstance]),\n primeCache: false,\n highlightKey,\n renderOptionsVersion,\n requestStart,\n };\n case 'diff':\n return {\n type: 'diff',\n id,\n request: { ...request, id },\n instances: new Set([instance as DiffRendererInstance]),\n primeCache: false,\n highlightKey,\n renderOptionsVersion,\n requestStart,\n };\n }\n })();\n this.enqueueRenderTask(task, instance);\n }\n\n private submitCacheTask(request: SubmitRequest, highlightKey: string): void {\n if (this.initialized === false) {\n this.queueInitialization();\n }\n const id = this.generateRequestId();\n const requestStart = Date.now();\n const { renderOptionsVersion } = this;\n const task: RenderTask = (() => {\n switch (request.type) {\n case 'file':\n return {\n type: 'file',\n id,\n request: { ...request, id },\n instances: new Set<FileRendererInstance>(),\n primeCache: true,\n highlightKey,\n renderOptionsVersion,\n requestStart,\n };\n case 'diff':\n return {\n type: 'diff',\n id,\n request: { ...request, id },\n instances: new Set<DiffRendererInstance>(),\n primeCache: true,\n highlightKey,\n renderOptionsVersion,\n requestStart,\n };\n }\n })();\n this.enqueueRenderTask(task);\n }\n\n private enqueueRenderTask(\n task: RenderTask,\n instance?: RenderTaskInstance\n ): void {\n this.queuedTasks.push(task);\n if (instance != null) {\n this.queuedTaskByInstance.set(instance, task);\n }\n if (task.highlightKey != null) {\n this.taskByHighlightKey.set(task.highlightKey, task);\n }\n this.queueDrain();\n }\n\n private async resolveLanguagesAndExecuteTask(\n availableWorker: ManagedWorker,\n task: RenderFileTask | RenderDiffTask,\n langs: SupportedLanguages[]\n ): Promise<void> {\n try {\n // Add resolved languages if required\n const workerMissingLangs = langs.filter(\n (lang) => !availableWorker.langs.has(lang)\n );\n\n if (workerMissingLangs.length > 0) {\n if (hasResolvedLanguages(workerMissingLangs)) {\n task.request.resolvedLanguages =\n getResolvedLanguages(workerMissingLangs);\n } else {\n task.request.resolvedLanguages =\n await resolveLanguages(workerMissingLangs);\n }\n }\n // If the task has been cleaned up after awaiting language resolving,\n // lets fully clean it up\n if (!this.activeTaskById.has(task.id)) {\n if (availableWorker.requestId === task.id) {\n this.cleanWorkerAndTask(availableWorker, task);\n this.queueBroadcastStateChanges();\n if (this.queuedTasks.length > 0) {\n this.queueDrain();\n }\n }\n return;\n }\n this.executeTask(availableWorker, task);\n } catch {\n this.cleanWorkerAndTask(availableWorker, task);\n this.queueBroadcastStateChanges();\n if (this.queuedTasks.length > 0) {\n this.queueDrain();\n }\n }\n }\n\n private handleWorkerMessage(\n managedWorker: ManagedWorker,\n response: WorkerResponse\n ): void {\n const task = this.activeTaskById.get(response.id);\n try {\n if (task == null) {\n // If we can't find a task for this response, it probably means the\n // component has been unmounted, so we should silently ignore it\n throw IGNORE_RESPONSE;\n } else if (response.type === 'error') {\n const error = new Error(response.error);\n if (response.stack) {\n error.stack = response.stack;\n }\n if ('reject' in task) {\n task.reject(error);\n } else if (isRenderTask(task)) {\n this.notifyHighlightError(task, error);\n } else {\n throw new Error('handleWorkerMessage: unknown task type');\n }\n throw error;\n } else {\n switch (response.requestType) {\n case 'initialize':\n if (task.type !== 'initialize') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n this.syncCustomExtensionVersion(managedWorker, task.request);\n task.resolve();\n break;\n case 'set-render-options':\n if (task.type !== 'set-render-options') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n task.resolve();\n break;\n case 'file': {\n if (task.type !== 'file') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n const { result, options } = response;\n if (\n !this.isCurrentRenderTask(task) ||\n !areFileRenderOptionsEqual(options, this.getFileRenderOptions())\n ) {\n throw IGNORE_RESPONSE;\n }\n const { request } = task;\n this.syncCustomExtensionVersion(managedWorker, request);\n if (request.file.cacheKey != null) {\n this.fileCache.set(request.file.cacheKey, { result, options });\n }\n this.notifyFileInstances(task, result, options);\n break;\n }\n case 'diff': {\n if (task.type !== 'diff') {\n throw new Error('handleWorkerMessage: task/response dont match');\n }\n const { result, options } = response;\n if (\n !this.isCurrentRenderTask(task) ||\n !areDiffRenderOptionsEqual(options, this.getDiffRenderOptions())\n ) {\n throw IGNORE_RESPONSE;\n }\n const { request } = task;\n this.syncCustomExtensionVersion(managedWorker, request);\n if (request.diff.cacheKey != null) {\n this.diffCache.set(request.diff.cacheKey, { result, options });\n }\n this.notifyDiffInstances(task, result, options);\n break;\n }\n }\n }\n } catch (error) {\n if (error !== IGNORE_RESPONSE) {\n console.error(error, task, response);\n }\n }\n\n this.cleanWorkerAndTask(managedWorker, task, response.id);\n this.queueBroadcastStateChanges();\n if (this.queuedTasks.length > 0) {\n // We queue drain so that potentially multiple workers can free up\n // allowing for better language matches if possible\n this.queueDrain();\n }\n }\n\n private _queuedDrain: Promise<void> | undefined;\n private queueDrain() {\n if (this._queuedDrain != null) return;\n this._queuedDrain = Promise.resolve().then(this.drainQueue);\n this.queueBroadcastStateChanges();\n }\n\n private assignWorkerToTask(\n task: AllWorkerTasks,\n managedWorker: ManagedWorker\n ) {\n managedWorker.requestId = task.id;\n if (isRenderTask(task)) {\n this.clearQueuedInstanceRequests(task);\n this.trackInstanceRequests(task);\n }\n this.activeTaskById.set(task.id, task);\n }\n\n private cleanWorkerAndTask(\n managedWorker: ManagedWorker,\n task?: AllWorkerTasks,\n requestId: WorkerRequestId | undefined = task?.id\n ) {\n if (managedWorker.requestId === requestId) {\n managedWorker.requestId = undefined;\n }\n if (managedWorker.pendingSetupRequestId === requestId) {\n managedWorker.pendingSetupRequestId = undefined;\n }\n if (task != null) {\n if (isRenderTask(task)) {\n this.clearInstanceRequests(task);\n this.clearHighlightKey(task);\n }\n this.activeTaskById.delete(task.id);\n }\n }\n\n private executeTask(\n managedWorker: ManagedWorker,\n task: AllWorkerTasks\n ): void {\n if (shouldSyncCustomExtensions(task.request)) {\n this.maybeAttachCustomExtensions(managedWorker, task.request);\n }\n if (!this.activeTaskById.has(task.id)) {\n this.assignWorkerToTask(task, managedWorker);\n }\n for (const lang of getLangsFromTask(task)) {\n managedWorker.langs.add(lang);\n }\n try {\n managedWorker.worker.postMessage(task.request);\n } catch (error) {\n console.error('Failed to post message to worker:', error);\n if (isRenderTask(task)) {\n this.notifyHighlightError(task, error);\n } else if ('reject' in task) {\n task.reject(error as Error);\n }\n this.cleanWorkerAndTask(managedWorker, task);\n if (this.queuedTasks.length > 0) {\n this.queueDrain();\n }\n }\n this.queueBroadcastStateChanges();\n }\n\n private maybeAttachCustomExtensions(\n managedWorker: ManagedWorker,\n request: InitializeWorkerRequest | RenderFileRequest | RenderDiffRequest\n ): void {\n if (request.customExtensionsVersion != null) {\n return;\n }\n const version = getCustomExtensionsVersion();\n if (managedWorker.customExtensionsVersion >= version) {\n return;\n }\n request.customExtensionsVersion = version;\n request.customExtensionMap = getCustomExtensionsMap();\n }\n\n private syncCustomExtensionVersion(\n managedWorker: ManagedWorker,\n request: InitializeWorkerRequest | RenderFileRequest | RenderDiffRequest\n ): void {\n if (request.customExtensionsVersion == null) {\n return;\n }\n managedWorker.customExtensionsVersion = request.customExtensionsVersion;\n }\n\n private getAvailableWorker(\n langs: SupportedLanguages[]\n ): ManagedWorker | undefined {\n let worker: ManagedWorker | undefined;\n for (const managedWorker of this.workers) {\n if (\n managedWorker.requestId != null ||\n managedWorker.pendingSetupRequestId != null ||\n !managedWorker.initialized\n ) {\n continue;\n }\n worker = managedWorker;\n if (langs.length === 0) {\n break;\n }\n let hasEveryLang = true;\n for (const lang of langs) {\n if (!managedWorker.langs.has(lang)) {\n hasEveryLang = false;\n break;\n }\n }\n if (hasEveryLang) {\n break;\n }\n }\n return worker;\n }\n\n private getFileHighlightKey(file: FileContents): string | undefined {\n if (file.cacheKey == null) {\n return undefined;\n }\n return `file:${file.cacheKey}:${this.renderOptionsVersion}`;\n }\n\n private getDiffHighlightKey(diff: FileDiffMetadata): string | undefined {\n if (diff.cacheKey == null) {\n return undefined;\n }\n return `diff:${diff.cacheKey}:${this.renderOptionsVersion}`;\n }\n\n private getHighlightKeyForRequest(\n request: SubmitRequest\n ): string | undefined {\n switch (request.type) {\n case 'file':\n return this.getFileHighlightKey(request.file);\n case 'diff':\n return this.getDiffHighlightKey(request.diff);\n }\n }\n\n private hasActiveRequest(task: RenderTask): boolean {\n for (const instance of getInstances(task)) {\n if (this.activeRequestByInstance.has(instance)) {\n return true;\n }\n }\n return false;\n }\n\n private addInstanceToTask(\n task: RenderTask,\n instance: FileRendererInstance | DiffRendererInstance\n ): void {\n if (task.type === 'file') {\n task.instances.add(instance as FileRendererInstance);\n } else {\n task.instances.add(instance as DiffRendererInstance);\n }\n if (this.activeTaskById.has(task.id)) {\n this.activeRequestByInstance.set(instance, task.id);\n } else {\n this.queuedTaskByInstance.set(instance, task);\n }\n }\n\n private detachInstanceFromQueuedTasks(\n instance: RenderTaskInstance,\n exceptTask?: RenderTask\n ): void {\n const task = this.queuedTaskByInstance.get(instance);\n if (task == null || task === exceptTask) {\n return;\n }\n this.queuedTaskByInstance.delete(instance);\n this.detachInstanceFromRenderTask(task, instance);\n if (!task.primeCache && task.instances.size === 0) {\n this.removeQueuedTask(task);\n }\n }\n\n private detachInstanceFromRenderTask(\n task: RenderTask,\n instance: RenderTaskInstance\n ): void {\n if (task.type === 'file') {\n task.instances.delete(instance as FileRendererInstance);\n } else {\n task.instances.delete(instance as DiffRendererInstance);\n }\n }\n\n private removeQueuedTask(task: RenderTask): void {\n const index = this.queuedTasks.indexOf(task);\n if (index !== -1) {\n this.queuedTasks.splice(index, 1);\n }\n this.clearQueuedInstanceRequests(task);\n this.clearHighlightKey(task);\n }\n\n private removeActiveTask(task: RenderTask): void {\n this.clearInstanceRequests(task);\n this.clearHighlightKey(task);\n this.activeTaskById.delete(task.id);\n }\n\n private invalidateRenderTasks(): void {\n for (let index = this.queuedTasks.length - 1; index >= 0; index--) {\n const task = this.queuedTasks[index];\n if (task.renderOptionsVersion !== this.renderOptionsVersion) {\n this.removeQueuedTask(task);\n }\n }\n\n for (const task of Array.from(this.activeTaskById.values())) {\n if (\n isRenderTask(task) &&\n task.renderOptionsVersion !== this.renderOptionsVersion\n ) {\n this.removeActiveTask(task);\n }\n }\n }\n\n private clearQueuedInstanceRequests(task: RenderTask): void {\n for (const instance of getInstances(task)) {\n if (this.queuedTaskByInstance.get(instance) === task) {\n this.queuedTaskByInstance.delete(instance);\n }\n }\n }\n\n private clearHighlightKey(task: RenderTask): void {\n if (\n task.highlightKey != null &&\n this.taskByHighlightKey.get(task.highlightKey) === task\n ) {\n this.taskByHighlightKey.delete(task.highlightKey);\n }\n }\n\n private trackInstanceRequests(task: RenderTask): void {\n for (const instance of getInstances(task)) {\n this.activeRequestByInstance.set(instance, task.id);\n }\n }\n\n private clearInstanceRequests(task: RenderTask): void {\n for (const instance of getInstances(task)) {\n if (this.activeRequestByInstance.get(instance) === task.id) {\n this.activeRequestByInstance.delete(instance);\n }\n }\n }\n\n private notifyFileInstances(\n task: RenderFileTask,\n result: ThemedFileResult,\n options: RenderFileOptions\n ): void {\n for (const instance of task.instances) {\n if (this.activeRequestByInstance.get(instance) === task.id) {\n instance.onHighlightSuccess(task.request.file, result, options);\n }\n }\n }\n\n private notifyDiffInstances(\n task: RenderDiffTask,\n result: ThemedDiffResult,\n options: RenderDiffOptions\n ): void {\n for (const instance of task.instances) {\n if (this.activeRequestByInstance.get(instance) === task.id) {\n instance.onHighlightSuccess(task.request.diff, result, options);\n }\n }\n }\n\n private notifyHighlightError(task: RenderTask, error: unknown): void {\n for (const instance of getInstances(task)) {\n if (this.activeRequestByInstance.get(instance) === task.id) {\n instance.onHighlightError(error);\n }\n }\n }\n\n private hasMatchingFileInstanceTask(\n instance: FileRendererInstance,\n file: FileContents\n ): boolean {\n for (const task of this.iterateRenderTasks()) {\n if (\n task.type === 'file' &&\n this.isCurrentRenderTask(task) &&\n task.instances.has(instance) &&\n areFilesEqual(file, task.request.file)\n ) {\n return true;\n }\n }\n return false;\n }\n\n private hasMatchingDiffInstanceTask(\n instance: DiffRendererInstance,\n diff: FileDiffMetadata\n ): boolean {\n for (const task of this.iterateRenderTasks()) {\n if (\n task.type === 'diff' &&\n this.isCurrentRenderTask(task) &&\n task.instances.has(instance) &&\n areDiffTargetsEqual(task.request.diff, diff)\n ) {\n return true;\n }\n }\n return false;\n }\n\n private getTaskByHighlightKey(highlightKey: string): RenderTask | undefined {\n const task = this.taskByHighlightKey.get(highlightKey);\n return task != null && this.isCurrentRenderTask(task) ? task : undefined;\n }\n\n private isCurrentRenderTask(task: RenderTask): boolean {\n return task.renderOptionsVersion === this.renderOptionsVersion;\n }\n\n private *iterateRenderTasks(): Generator<RenderTask> {\n for (const task of this.queuedTasks) {\n yield task;\n }\n for (const task of this.activeTaskById.values()) {\n if (isRenderTask(task)) {\n yield task;\n }\n }\n }\n\n private generateRequestId(): WorkerRequestId {\n return `req_${++this.nextRequestId}`;\n }\n}\n\nfunction shouldSyncCustomExtensions(\n request: AllWorkerTasks['request']\n): request is InitializeWorkerRequest | RenderFileRequest | RenderDiffRequest {\n return (\n request.type === 'initialize' ||\n request.type === 'file' ||\n request.type === 'diff'\n );\n}\n\nfunction getLangsFromTask(task: AllWorkerTasks): SupportedLanguages[] {\n const langs = new Set<SupportedLanguages>();\n if (task.type === 'initialize' || task.type === 'set-render-options') {\n return [];\n }\n switch (task.type) {\n case 'file': {\n langs.add(\n task.request.file.lang ??\n getFiletypeFromFileName(task.request.file.name)\n );\n break;\n }\n case 'diff': {\n langs.add(\n task.request.diff.lang ??\n getFiletypeFromFileName(task.request.diff.name)\n );\n langs.add(\n task.request.diff.lang ??\n getFiletypeFromFileName(task.request.diff.prevName ?? '-')\n );\n break;\n }\n }\n langs.delete('text');\n return Array.from(langs);\n}\n\nfunction isRenderTask(task: AllWorkerTasks | undefined): task is RenderTask {\n return task?.type === 'file' || task?.type === 'diff';\n}\n\nfunction getInstances(\n task: RenderTask\n): Set<FileRendererInstance | DiffRendererInstance> {\n return task.instances as Set<FileRendererInstance | DiffRendererInstance>;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pierre/diffs",
3
- "version": "1.2.7",
3
+ "version": "1.2.8",
4
4
  "license": "apache-2.0",
5
5
  "files": [
6
6
  "dist",
@@ -54,12 +54,13 @@
54
54
  }
55
55
  },
56
56
  "scripts": {
57
+ "assert:bun-version": "bun ../../scripts/assert-bun-version.ts",
57
58
  "build": "tsdown --clean",
58
59
  "dev": "echo 'Watching for changes…' && tsdown --watch --log-level error",
59
60
  "benchmark:parse-merge-conflict": "bun run ./scripts/benchmarkParseMergeConflictDiffFromFile.ts",
60
61
  "test": "bun test",
61
62
  "tsc": "tsgo --noEmit --pretty",
62
- "prepublishOnly": "bun run build"
63
+ "prepublishOnly": "bun run assert:bun-version && bun run build"
63
64
  },
64
65
  "dependencies": {
65
66
  "@pierre/theme": "1.0.3",