@pierre/diffs 1.1.15 → 1.1.17

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":"File.d.ts","names":["GetHoveredLineResult","InteractionManager","InteractionManagerBaseOptions","SelectedLineRange","ResizeManager","FileRenderer","AppliedThemeStyleCache","BaseCodeOptions","FileContents","LineAnnotation","PrePropertiesConfig","RenderFileMetadata","RenderRange","ThemeTypes","WorkerPoolManager","FileRenderProps","LAnnotation","HTMLElement","FileHydrateProps","Omit","FileOptions","File","AnnotationElementCache","HydrationSetup","SVGElement","HTMLPreElement","HTMLStyleElement","Map","file","lineAnnotations","fileContainer","forceRender","preventEmit","containerWrapper","renderRange"],"sources":["../../src/components/File.d.ts"],"sourcesContent":["import { type GetHoveredLineResult, InteractionManager, type InteractionManagerBaseOptions, type SelectedLineRange } from '../managers/InteractionManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { FileRenderer } from '../renderers/FileRenderer';\nimport type { AppliedThemeStyleCache, BaseCodeOptions, FileContents, LineAnnotation, PrePropertiesConfig, RenderFileMetadata, RenderRange, ThemeTypes } from '../types';\nimport type { WorkerPoolManager } from '../worker';\nexport interface FileRenderProps<LAnnotation> {\n file: FileContents;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n forceRender?: boolean;\n preventEmit?: boolean;\n lineAnnotations?: LineAnnotation<LAnnotation>[];\n renderRange?: RenderRange;\n}\nexport interface FileHydrateProps<LAnnotation> extends Omit<FileRenderProps<LAnnotation>, 'fileContainer'> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\nexport interface FileOptions<LAnnotation> extends BaseCodeOptions, InteractionManagerBaseOptions<'file'> {\n disableFileHeader?: boolean;\n /**\n * @deprecated Use `enableGutterUtility` instead.\n */\n enableHoverUtility?: boolean;\n renderHeaderPrefix?: RenderFileMetadata;\n renderCustomMetadata?: RenderFileMetadata;\n renderCustomHeader?: RenderFileMetadata;\n /**\n * When true, errors during rendering are rethrown instead of being caught\n * and displayed in the DOM. Useful for testing or when you want to handle\n * errors yourself.\n */\n disableErrorHandling?: boolean;\n renderAnnotation?(annotation: LineAnnotation<LAnnotation>): HTMLElement | undefined;\n renderGutterUtility?(getHoveredRow: () => GetHoveredLineResult<'file'> | undefined): HTMLElement | null | undefined;\n /**\n * @deprecated Use `renderGutterUtility` instead.\n */\n renderHoverUtility?(getHoveredRow: () => GetHoveredLineResult<'file'> | undefined): HTMLElement | null | undefined;\n onPostRender?(node: HTMLElement, instance: File<LAnnotation>): unknown;\n}\ninterface AnnotationElementCache<LAnnotation> {\n element: HTMLElement;\n annotation: LineAnnotation<LAnnotation>;\n}\ninterface HydrationSetup<LAnnotation> {\n file: FileContents;\n lineAnnotations: LineAnnotation<LAnnotation>[] | undefined;\n}\nexport declare class File<LAnnotation = undefined> {\n options: FileOptions<LAnnotation>;\n private workerManager?;\n private isContainerManaged;\n static LoadedCustomComponent: boolean;\n readonly __id: string;\n protected fileContainer: HTMLElement | undefined;\n protected spriteSVG: SVGElement | undefined;\n protected pre: HTMLPreElement | undefined;\n protected code: HTMLElement | undefined;\n protected bufferBefore: HTMLElement | undefined;\n protected bufferAfter: HTMLElement | undefined;\n protected themeCSSStyle: HTMLStyleElement | undefined;\n protected appliedThemeCSS: AppliedThemeStyleCache | undefined;\n protected unsafeCSSStyle: HTMLStyleElement | undefined;\n protected appliedUnsafeCSS: string | undefined;\n protected gutterUtilityContent: HTMLElement | undefined;\n protected errorWrapper: HTMLElement | undefined;\n protected placeHolder: HTMLElement | undefined;\n protected lastRenderedHeaderHTML: string | undefined;\n protected appliedPreAttributes: PrePropertiesConfig | undefined;\n protected lastRowCount: number | undefined;\n protected headerElement: HTMLElement | undefined;\n protected headerCustom: HTMLElement | undefined;\n protected headerPrefix: HTMLElement | undefined;\n protected headerMetadata: HTMLElement | undefined;\n protected fileRenderer: FileRenderer<LAnnotation>;\n protected resizeManager: ResizeManager;\n protected interactionManager: InteractionManager<'file'>;\n protected annotationCache: Map<string, AnnotationElementCache<LAnnotation>>;\n protected lineAnnotations: LineAnnotation<LAnnotation>[];\n protected file: FileContents | undefined;\n protected renderRange: RenderRange | undefined;\n constructor(options?: FileOptions<LAnnotation>, workerManager?: WorkerPoolManager | undefined, isContainerManaged?: boolean);\n private handleHighlightRender;\n rerender(): void;\n setOptions(options: FileOptions<LAnnotation> | undefined): void;\n private mergeOptions;\n setThemeType(themeType: ThemeTypes): void;\n getHoveredLine: () => {\n lineNumber: number;\n } | undefined;\n setLineAnnotations(lineAnnotations: LineAnnotation<LAnnotation>[]): void;\n setSelectedLines(range: SelectedLineRange | null): void;\n cleanUp(): void;\n hydrate(props: FileHydrateProps<LAnnotation>): void;\n protected hydrateElements(fileContainer: HTMLElement, prerenderedHTML: string | undefined): void;\n protected hydrationSetup({ file, lineAnnotations }: HydrationSetup<LAnnotation>): void;\n getOrCreateLineCache(file?: FileContents | undefined): string[];\n render({ file, fileContainer, forceRender, preventEmit, containerWrapper, lineAnnotations, renderRange }: FileRenderProps<LAnnotation>): boolean;\n private emitPostRender;\n private removeRenderedCode;\n private clearAuxiliaryNodes;\n private canPartiallyRender;\n renderPlaceholder(height: number): boolean;\n private cleanChildNodes;\n private renderAnnotations;\n private renderGutterUtility;\n private injectUnsafeCSS;\n private applyThemeState;\n private applyFullRender;\n private applyPartialRender;\n private getColumns;\n private trimDOMToOverlap;\n private getDOMBoundaryIndices;\n private getLineIndexFromDOMNode;\n private applyBuffers;\n private applyHeaderToDOM;\n private clearHeaderSlots;\n private upsertHeaderSlotElement;\n private replaceHeaderSlotContent;\n private createHeaderSlotElement;\n protected getOrCreateFileContainerNode(fileContainer?: HTMLElement, parentNode?: HTMLElement): HTMLElement;\n private getOrCreatePreNode;\n private syncCodeNodeFromPre;\n private applyPreNodeAttributes;\n private applyErrorToDOM;\n private cleanupErrorWrapper;\n}\nexport {};\n//# sourceMappingURL=File.d.ts.map"],"mappings":"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"}
1
+ {"version":3,"file":"File.d.ts","names":["GetHoveredLineResult","InteractionManager","InteractionManagerBaseOptions","SelectedLineRange","ResizeManager","FileRenderer","AppliedThemeStyleCache","BaseCodeOptions","FileContents","LineAnnotation","PrePropertiesConfig","RenderFileMetadata","RenderRange","ThemeTypes","WorkerPoolManager","FileRenderProps","LAnnotation","HTMLElement","FileHydrateProps","Omit","FileOptions","File","AnnotationElementCache","HydrationSetup","SVGElement","HTMLPreElement","HTMLStyleElement","Map","file","lineAnnotations","fileContainer","forceRender","preventEmit","containerWrapper","renderRange"],"sources":["../../src/components/File.d.ts"],"sourcesContent":["import { type GetHoveredLineResult, InteractionManager, type InteractionManagerBaseOptions, type SelectedLineRange } from '../managers/InteractionManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { FileRenderer } from '../renderers/FileRenderer';\nimport type { AppliedThemeStyleCache, BaseCodeOptions, FileContents, LineAnnotation, PrePropertiesConfig, RenderFileMetadata, RenderRange, ThemeTypes } from '../types';\nimport type { WorkerPoolManager } from '../worker';\nexport interface FileRenderProps<LAnnotation> {\n file: FileContents;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n forceRender?: boolean;\n preventEmit?: boolean;\n lineAnnotations?: LineAnnotation<LAnnotation>[];\n renderRange?: RenderRange;\n}\nexport interface FileHydrateProps<LAnnotation> extends Omit<FileRenderProps<LAnnotation>, 'fileContainer'> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\nexport interface FileOptions<LAnnotation> extends BaseCodeOptions, InteractionManagerBaseOptions<'file'> {\n disableFileHeader?: boolean;\n /**\n * @deprecated Use `enableGutterUtility` instead.\n */\n enableHoverUtility?: boolean;\n renderHeaderPrefix?: RenderFileMetadata;\n renderCustomMetadata?: RenderFileMetadata;\n renderCustomHeader?: RenderFileMetadata;\n /**\n * When true, errors during rendering are rethrown instead of being caught\n * and displayed in the DOM. Useful for testing or when you want to handle\n * errors yourself.\n */\n disableErrorHandling?: boolean;\n renderAnnotation?(annotation: LineAnnotation<LAnnotation>): HTMLElement | undefined;\n renderGutterUtility?(getHoveredRow: () => GetHoveredLineResult<'file'> | undefined): HTMLElement | null | undefined;\n /**\n * @deprecated Use `renderGutterUtility` instead.\n */\n renderHoverUtility?(getHoveredRow: () => GetHoveredLineResult<'file'> | undefined): HTMLElement | null | undefined;\n onPostRender?(node: HTMLElement, instance: File<LAnnotation>): unknown;\n}\ninterface AnnotationElementCache<LAnnotation> {\n element: HTMLElement;\n annotation: LineAnnotation<LAnnotation>;\n}\ninterface HydrationSetup<LAnnotation> {\n file: FileContents;\n lineAnnotations: LineAnnotation<LAnnotation>[] | undefined;\n}\nexport declare class File<LAnnotation = undefined> {\n options: FileOptions<LAnnotation>;\n private workerManager?;\n private isContainerManaged;\n static LoadedCustomComponent: boolean;\n readonly __id: string;\n protected fileContainer: HTMLElement | undefined;\n protected spriteSVG: SVGElement | undefined;\n protected pre: HTMLPreElement | undefined;\n protected code: HTMLElement | undefined;\n protected bufferBefore: HTMLElement | undefined;\n protected bufferAfter: HTMLElement | undefined;\n protected themeCSSStyle: HTMLStyleElement | undefined;\n protected appliedThemeCSS: AppliedThemeStyleCache | undefined;\n protected unsafeCSSStyle: HTMLStyleElement | undefined;\n protected appliedUnsafeCSS: string | undefined;\n protected gutterUtilityContent: HTMLElement | undefined;\n protected errorWrapper: HTMLElement | undefined;\n protected placeHolder: HTMLElement | undefined;\n protected lastRenderedHeaderHTML: string | undefined;\n protected appliedPreAttributes: PrePropertiesConfig | undefined;\n protected lastRowCount: number | undefined;\n protected headerElement: HTMLElement | undefined;\n protected headerCustom: HTMLElement | undefined;\n protected headerPrefix: HTMLElement | undefined;\n protected headerMetadata: HTMLElement | undefined;\n protected fileRenderer: FileRenderer<LAnnotation>;\n protected resizeManager: ResizeManager;\n protected interactionManager: InteractionManager<'file'>;\n protected annotationCache: Map<string, AnnotationElementCache<LAnnotation>>;\n protected lineAnnotations: LineAnnotation<LAnnotation>[];\n protected file: FileContents | undefined;\n protected renderRange: RenderRange | undefined;\n constructor(options?: FileOptions<LAnnotation>, workerManager?: WorkerPoolManager | undefined, isContainerManaged?: boolean);\n private handleHighlightRender;\n rerender(): void;\n setOptions(options: FileOptions<LAnnotation> | undefined): void;\n private mergeOptions;\n setThemeType(themeType: ThemeTypes): void;\n getHoveredLine: () => {\n lineNumber: number;\n } | undefined;\n setLineAnnotations(lineAnnotations: LineAnnotation<LAnnotation>[]): void;\n setSelectedLines(range: SelectedLineRange | null): void;\n cleanUp(): void;\n hydrate(props: FileHydrateProps<LAnnotation>): void;\n protected hydrateElements(fileContainer: HTMLElement, prerenderedHTML: string | undefined): void;\n protected hydrationSetup({ file, lineAnnotations }: HydrationSetup<LAnnotation>): void;\n getOrCreateLineCache(file?: FileContents | undefined): string[];\n render({ file, fileContainer, forceRender, preventEmit, containerWrapper, lineAnnotations, renderRange }: FileRenderProps<LAnnotation>): boolean;\n private emitPostRender;\n private removeRenderedCode;\n private clearAuxiliaryNodes;\n private canPartiallyRender;\n renderPlaceholder(height: number): boolean;\n private cleanChildNodes;\n private renderAnnotations;\n private renderGutterUtility;\n private injectUnsafeCSS;\n private applyThemeState;\n private applyFullRender;\n private applyPartialRender;\n private getColumns;\n private trimDOMToOverlap;\n private getDOMBoundaryIndices;\n private getLineIndexFromDOMNode;\n private applyBuffers;\n private applyHeaderToDOM;\n private clearHeaderSlots;\n private upsertHeaderSlotElement;\n private replaceHeaderSlotContent;\n private createHeaderSlotElement;\n protected getOrCreateFileContainerNode(fileContainer?: HTMLElement, parentNode?: HTMLElement): HTMLElement;\n private getOrCreatePreNode;\n private syncCodeNodeFromPre;\n private applyPreNodeAttributes;\n private applyErrorToDOM;\n private cleanupErrorWrapper;\n}\nexport {};\n//# sourceMappingURL=File.d.ts.map"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","names":["HunkExpansionRegion","RenderRange","ThemesType","VirtualFileMetrics","DIFFS_TAG_NAME","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","DEFAULT_COLLAPSED_CONTEXT_THRESHOLD","DEFAULT_VIRTUAL_FILE_METRICS","DEFAULT_EXPANDED_REGION","DEFAULT_RENDER_RANGE","EMPTY_RENDER_RANGE"],"sources":["../src/constants.d.ts"],"sourcesContent":["import type { HunkExpansionRegion, RenderRange, ThemesType, VirtualFileMetrics } from './types';\nexport declare const DIFFS_TAG_NAME: \"diffs-container\";\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 DEFAULT_COLLAPSED_CONTEXT_THRESHOLD = 1;\nexport declare const DEFAULT_VIRTUAL_FILE_METRICS: VirtualFileMetrics;\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":";;;cACqBI;cACAC,uBAAuBC;AADvBF,cAEAG,yBAFiC,EAEND,MAFM;AACjCD,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,EAEPrB,UAFO;AACvBoB,cAEAE,mBAAAA,GAFqB,gBAAA;AACrBD,cAEAE,oBAAAA,GAF0B,iBAAA;AAC1BD,cAEAE,kBAAAA,GAFmB,eAAA;AACnBD,cAEAE,mCAAAA,GAFoB,CAAA;AACpBD,cAEAE,4BAFkB,EAEYzB,kBAFZ;AAClBwB,cAEAE,uBAFmC,EAEV7B,mBAFU;AACnC4B,cAEAE,oBAFgD,EAE1B7B,WAFQE;AAC9B0B,cAEAE,kBAF4C,EAExB9B,WAFKD"}
1
+ {"version":3,"file":"constants.d.ts","names":["HunkExpansionRegion","RenderRange","ThemesType","VirtualFileMetrics","DIFFS_TAG_NAME","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","DEFAULT_COLLAPSED_CONTEXT_THRESHOLD","DEFAULT_VIRTUAL_FILE_METRICS","DEFAULT_EXPANDED_REGION","DEFAULT_RENDER_RANGE","EMPTY_RENDER_RANGE"],"sources":["../src/constants.d.ts"],"sourcesContent":["import type { HunkExpansionRegion, RenderRange, ThemesType, VirtualFileMetrics } from './types';\nexport declare const DIFFS_TAG_NAME: \"diffs-container\";\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 DEFAULT_COLLAPSED_CONTEXT_THRESHOLD = 1;\nexport declare const DEFAULT_VIRTUAL_FILE_METRICS: VirtualFileMetrics;\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":";;;cACqBI;cACAC,uBAAuBC;AADvBF,cAEAG,yBAFiC,EAEND,MAFM;AACjCD,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,EAEPrB,UAFO;AACvBoB,cAEAE,mBAAAA,GAFqB,gBAAA;AACrBD,cAEAE,oBAAAA,GAFgBvB,iBAAU;AAC1BsB,cAEAE,kBAAAA,GAFmB,eAAA;AACnBD,cAEAE,mCAAAA,GAFoB,CAAA;AACpBD,cAEAE,4BAFkB,EAEYzB,kBAFZ;AAClBwB,cAEAE,uBAFmC,EAEV7B,mBAFU;AACnC4B,cAEAE,oBAFgD,EAE1B7B,WAFQE;AAC9B0B,cAEAE,kBAF4C,EAExB9B,WAFKD"}
@@ -2,7 +2,10 @@ import { AttachedLanguages } from "./constants.js";
2
2
 
3
3
  //#region src/highlighter/languages/areLanguagesAttached.ts
4
4
  function areLanguagesAttached(languages) {
5
- for (const language of Array.isArray(languages) ? languages : [languages]) if (!AttachedLanguages.has(language)) return false;
5
+ for (const language of Array.isArray(languages) ? languages : [languages]) {
6
+ if (language === "text" || language === "ansi") continue;
7
+ if (!AttachedLanguages.has(language)) return false;
8
+ }
6
9
  return true;
7
10
  }
8
11
 
@@ -1 +1 @@
1
- {"version":3,"file":"areLanguagesAttached.js","names":[],"sources":["../../../src/highlighter/languages/areLanguagesAttached.ts"],"sourcesContent":["import type { SupportedLanguages } from '../../types';\nimport { AttachedLanguages } from './constants';\n\nexport function areLanguagesAttached(\n languages: SupportedLanguages | SupportedLanguages[]\n): boolean {\n for (const language of Array.isArray(languages) ? languages : [languages]) {\n if (!AttachedLanguages.has(language)) {\n return false;\n }\n }\n return true;\n}\n"],"mappings":";;;AAGA,SAAgB,qBACd,WACS;AACT,MAAK,MAAM,YAAY,MAAM,QAAQ,UAAU,GAAG,YAAY,CAAC,UAAU,CACvE,KAAI,CAAC,kBAAkB,IAAI,SAAS,CAClC,QAAO;AAGX,QAAO"}
1
+ {"version":3,"file":"areLanguagesAttached.js","names":[],"sources":["../../../src/highlighter/languages/areLanguagesAttached.ts"],"sourcesContent":["import type { SupportedLanguages } from '../../types';\nimport { AttachedLanguages } from './constants';\n\nexport function areLanguagesAttached(\n languages: SupportedLanguages | SupportedLanguages[]\n): boolean {\n for (const language of Array.isArray(languages) ? languages : [languages]) {\n if (language === 'text' || language === 'ansi') {\n continue;\n }\n if (!AttachedLanguages.has(language)) {\n return false;\n }\n }\n return true;\n}\n"],"mappings":";;;AAGA,SAAgB,qBACd,WACS;AACT,MAAK,MAAM,YAAY,MAAM,QAAQ,UAAU,GAAG,YAAY,CAAC,UAAU,EAAE;AACzE,MAAI,aAAa,UAAU,aAAa,OACtC;AAEF,MAAI,CAAC,kBAAkB,IAAI,SAAS,CAClC,QAAO;;AAGX,QAAO"}
@@ -121,7 +121,7 @@ var ResizeManager = class {
121
121
  }
122
122
  handleResizeObserver = (entries) => {
123
123
  for (const entry of entries) {
124
- const { target, borderBoxSize } = entry;
124
+ const { target, borderBoxSize, contentBoxSize } = entry;
125
125
  if (!(target instanceof HTMLElement)) {
126
126
  console.error("FileDiff.handleResizeObserver: Invalid element for ResizeObserver", entry);
127
127
  continue;
@@ -131,7 +131,6 @@ var ResizeManager = class {
131
131
  console.error("FileDiff.handleResizeObserver: Not a valid observed node", entry);
132
132
  continue;
133
133
  }
134
- const specs = borderBoxSize[0];
135
134
  if (item.type === "annotations") {
136
135
  const column = (() => {
137
136
  if (target === item.column1.child) return item.column1;
@@ -144,11 +143,11 @@ var ResizeManager = class {
144
143
  });
145
144
  continue;
146
145
  }
147
- column.childHeight = specs.blockSize;
146
+ column.childHeight = borderBoxSize[0].blockSize;
148
147
  const newHeight = Math.max(item.column1.childHeight, item.column2.childHeight);
149
148
  this.applyNewHeight(item, newHeight);
150
149
  } else if (item.type === "code") {
151
- const update = [target, specs.inlineSize];
150
+ const update = [target, contentBoxSize[0].inlineSize];
152
151
  const updates = this.queuedUpdates.get(item) ?? [];
153
152
  updates.push(update);
154
153
  this.queuedUpdates.set(item, updates);
@@ -1 +1 @@
1
- {"version":3,"file":"ResizeManager.js","names":["item: ObservedGridNodes | ObservedAnnotationNodes | undefined","update: CodeColumnUpdate"],"sources":["../../src/managers/ResizeManager.ts"],"sourcesContent":["import type { ObservedAnnotationNodes, ObservedGridNodes } from '../types';\n\ntype CodeColumnUpdate = [HTMLElement, number];\n\nexport class ResizeManager {\n private observedNodes = new Map<\n HTMLElement,\n ObservedAnnotationNodes | ObservedGridNodes\n >();\n private queuedUpdates: Map<ObservedGridNodes, CodeColumnUpdate[]> = new Map();\n\n cleanUp(): void {\n // Disconnect any existing observer\n this.resizeObserver?.disconnect();\n this.observedNodes.clear();\n this.queuedUpdates.clear();\n }\n\n private resizeObserver: ResizeObserver | undefined;\n\n setup(pre: HTMLPreElement, disableAnnotations: boolean): void {\n this.resizeObserver ??= new ResizeObserver(this.handleResizeObserver);\n const codeElements = pre.querySelectorAll('code');\n\n const observedNodes = new Map(this.observedNodes);\n this.observedNodes.clear();\n for (const codeElement of codeElements) {\n let item: ObservedGridNodes | ObservedAnnotationNodes | undefined =\n observedNodes.get(codeElement);\n if (item != null && item.type !== 'code') {\n throw new Error(\n 'ResizeManager.setup: somehow a code node is being used for an annotation, should be impossible'\n );\n }\n\n let numberElement = codeElement.firstElementChild;\n if (!(numberElement instanceof HTMLElement)) {\n numberElement = null;\n }\n\n if (item != null) {\n this.observedNodes.set(codeElement, item);\n observedNodes.delete(codeElement);\n if (item.numberElement !== numberElement) {\n if (item.numberElement != null) {\n this.resizeObserver.unobserve(item.numberElement);\n }\n if (numberElement != null) {\n this.resizeObserver.observe(numberElement);\n observedNodes.delete(numberElement);\n this.observedNodes.set(numberElement, item);\n }\n item.numberElement = numberElement;\n } else if (item.numberElement != null) {\n observedNodes.delete(item.numberElement);\n this.observedNodes.set(item.numberElement, item);\n }\n } else {\n item = {\n type: 'code',\n codeElement,\n numberElement,\n codeWidth: 'auto',\n numberWidth: 0,\n };\n this.observedNodes.set(codeElement, item);\n this.resizeObserver.observe(codeElement);\n if (numberElement != null) {\n this.observedNodes.set(numberElement, item);\n this.resizeObserver.observe(numberElement);\n }\n }\n }\n\n if (codeElements.length > 1 && !disableAnnotations) {\n const annotationElements = pre.querySelectorAll(\n '[data-line-annotation*=\",\"]'\n );\n\n const elementMap = new Map<string, HTMLElement[]>();\n for (const element of annotationElements) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n const { lineAnnotation = '' } = element.dataset;\n if (!/^\\d+,\\d+$/.test(lineAnnotation)) {\n console.error(\n 'DiffFileRenderer.setupResizeObserver: Invalid element or annotation',\n { lineAnnotation, element }\n );\n continue;\n }\n let pairs = elementMap.get(lineAnnotation);\n if (pairs == null) {\n pairs = [];\n elementMap.set(lineAnnotation, pairs);\n }\n pairs.push(element);\n }\n\n for (const [key, pair] of elementMap) {\n if (pair.length !== 2) {\n console.error(\n 'DiffFileRenderer.setupResizeObserver: Bad Pair',\n key,\n pair\n );\n continue;\n }\n const [container1, container2] = pair;\n const child1 = container1.firstElementChild;\n const child2 = container2.firstElementChild;\n if (\n !(container1 instanceof HTMLElement) ||\n !(container2 instanceof HTMLElement) ||\n !(child1 instanceof HTMLElement) ||\n !(child2 instanceof HTMLElement)\n ) {\n continue;\n }\n\n let item = observedNodes.get(child1);\n\n if (item != null) {\n this.observedNodes.set(child1, item);\n this.observedNodes.set(child2, item);\n observedNodes.delete(child1);\n observedNodes.delete(child2);\n continue;\n }\n\n item = {\n type: 'annotations',\n column1: {\n container: container1,\n child: child1,\n childHeight: child1.getBoundingClientRect().height,\n },\n column2: {\n container: container2,\n child: child2,\n childHeight: child2.getBoundingClientRect().height,\n },\n currentHeight: 'auto',\n };\n\n const newHeight = Math.max(\n item.column1.childHeight,\n item.column2.childHeight\n );\n this.applyNewHeight(item, newHeight);\n\n this.observedNodes.set(child1, item);\n this.observedNodes.set(child2, item);\n this.resizeObserver.observe(child1);\n this.resizeObserver.observe(child2);\n }\n }\n\n for (const element of observedNodes.keys()) {\n if (element.isConnected) {\n element.style.removeProperty('--diffs-column-content-width');\n element.style.removeProperty('--diffs-column-number-width');\n element.style.removeProperty('--diffs-column-width');\n if (element.parentElement instanceof HTMLElement) {\n element.parentElement.style.removeProperty(\n '--diffs-annotation-min-height'\n );\n }\n }\n this.resizeObserver.unobserve(element);\n }\n observedNodes.clear();\n }\n\n private handleResizeObserver = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { target, borderBoxSize } = entry;\n if (!(target instanceof HTMLElement)) {\n console.error(\n 'FileDiff.handleResizeObserver: Invalid element for ResizeObserver',\n entry\n );\n continue;\n }\n const item = this.observedNodes.get(target);\n if (item == null) {\n console.error(\n 'FileDiff.handleResizeObserver: Not a valid observed node',\n entry\n );\n continue;\n }\n const specs = borderBoxSize[0];\n if (item.type === 'annotations') {\n const column = (() => {\n if (target === item.column1.child) {\n return item.column1;\n }\n if (target === item.column2.child) {\n return item.column2;\n }\n return undefined;\n })();\n\n if (column == null) {\n console.error(\n `FileDiff.handleResizeObserver: Couldn't find a column for`,\n { item, target }\n );\n continue;\n }\n\n column.childHeight = specs.blockSize;\n const newHeight = Math.max(\n item.column1.childHeight,\n item.column2.childHeight\n );\n this.applyNewHeight(item, newHeight);\n } else if (item.type === 'code') {\n const update: CodeColumnUpdate = [target, specs.inlineSize];\n const updates = this.queuedUpdates.get(item) ?? [];\n updates.push(update);\n this.queuedUpdates.set(item, updates);\n }\n }\n this.handleColumnChange();\n };\n\n private handleColumnChange = () => {\n for (const [item, updates] of this.queuedUpdates) {\n for (const [target, targetInlineSize] of updates) {\n // FIXME(amadeus): This needs to be re-worked with display: contents,\n // not sure setting to auto is a good assumption most of the time...\n if (target === item.codeElement) {\n const inlineSize = Math.max(Math.floor(targetInlineSize), 0);\n if (inlineSize !== item.codeWidth) {\n const targetWidth = Math.max(inlineSize - item.numberWidth, 0);\n item.codeWidth = inlineSize === 0 ? 'auto' : inlineSize;\n item.codeElement.style.setProperty(\n '--diffs-column-content-width',\n `${targetWidth > 0 ? `${targetWidth}px` : 'auto'}`\n );\n item.codeElement.style.setProperty(\n '--diffs-column-width',\n `${typeof item.codeWidth === 'number' ? `${item.codeWidth}px` : 'auto'}`\n );\n }\n if (\n item.numberElement != null &&\n typeof item.codeWidth === 'number' &&\n item.numberWidth === 0\n ) {\n updates.push([\n item.numberElement,\n item.numberElement.getBoundingClientRect().width,\n ]);\n }\n } else if (target === item.numberElement) {\n const inlineSize = Math.max(Math.ceil(targetInlineSize), 0);\n if (inlineSize !== item.numberWidth) {\n item.numberWidth = inlineSize;\n item.codeElement.style.setProperty(\n '--diffs-column-number-width',\n `${item.numberWidth === 0 ? 'auto' : `${item.numberWidth}px`}`\n );\n // We probably need to update code width variable if\n // `numberWidth` changed\n if (item.codeWidth !== 'auto') {\n const targetWidth = Math.max(\n item.codeWidth - item.numberWidth,\n 0\n );\n item.codeElement.style.setProperty(\n '--diffs-column-content-width',\n `${targetWidth === 0 ? 'auto' : `${targetWidth}px`}`\n );\n }\n }\n }\n }\n }\n this.queuedUpdates.clear();\n };\n\n private applyNewHeight(item: ObservedAnnotationNodes, newHeight: number) {\n if (newHeight !== item.currentHeight) {\n item.currentHeight = Math.max(newHeight, 0);\n item.column1.container.style.setProperty(\n '--diffs-annotation-min-height',\n `${item.currentHeight}px`\n );\n item.column2.container.style.setProperty(\n '--diffs-annotation-min-height',\n `${item.currentHeight}px`\n );\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ResizeManager.js","names":["item: ObservedGridNodes | ObservedAnnotationNodes | undefined","update: CodeColumnUpdate"],"sources":["../../src/managers/ResizeManager.ts"],"sourcesContent":["import type { ObservedAnnotationNodes, ObservedGridNodes } from '../types';\n\ntype CodeColumnUpdate = [HTMLElement, number];\n\nexport class ResizeManager {\n private observedNodes = new Map<\n HTMLElement,\n ObservedAnnotationNodes | ObservedGridNodes\n >();\n private queuedUpdates: Map<ObservedGridNodes, CodeColumnUpdate[]> = new Map();\n\n cleanUp(): void {\n // Disconnect any existing observer\n this.resizeObserver?.disconnect();\n this.observedNodes.clear();\n this.queuedUpdates.clear();\n }\n\n private resizeObserver: ResizeObserver | undefined;\n\n setup(pre: HTMLPreElement, disableAnnotations: boolean): void {\n this.resizeObserver ??= new ResizeObserver(this.handleResizeObserver);\n const codeElements = pre.querySelectorAll('code');\n\n const observedNodes = new Map(this.observedNodes);\n this.observedNodes.clear();\n for (const codeElement of codeElements) {\n let item: ObservedGridNodes | ObservedAnnotationNodes | undefined =\n observedNodes.get(codeElement);\n if (item != null && item.type !== 'code') {\n throw new Error(\n 'ResizeManager.setup: somehow a code node is being used for an annotation, should be impossible'\n );\n }\n\n let numberElement = codeElement.firstElementChild;\n if (!(numberElement instanceof HTMLElement)) {\n numberElement = null;\n }\n\n if (item != null) {\n this.observedNodes.set(codeElement, item);\n observedNodes.delete(codeElement);\n if (item.numberElement !== numberElement) {\n if (item.numberElement != null) {\n this.resizeObserver.unobserve(item.numberElement);\n }\n if (numberElement != null) {\n this.resizeObserver.observe(numberElement);\n observedNodes.delete(numberElement);\n this.observedNodes.set(numberElement, item);\n }\n item.numberElement = numberElement;\n } else if (item.numberElement != null) {\n observedNodes.delete(item.numberElement);\n this.observedNodes.set(item.numberElement, item);\n }\n } else {\n item = {\n type: 'code',\n codeElement,\n numberElement,\n codeWidth: 'auto',\n numberWidth: 0,\n };\n this.observedNodes.set(codeElement, item);\n this.resizeObserver.observe(codeElement);\n if (numberElement != null) {\n this.observedNodes.set(numberElement, item);\n this.resizeObserver.observe(numberElement);\n }\n }\n }\n\n if (codeElements.length > 1 && !disableAnnotations) {\n const annotationElements = pre.querySelectorAll(\n '[data-line-annotation*=\",\"]'\n );\n\n const elementMap = new Map<string, HTMLElement[]>();\n for (const element of annotationElements) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n const { lineAnnotation = '' } = element.dataset;\n if (!/^\\d+,\\d+$/.test(lineAnnotation)) {\n console.error(\n 'DiffFileRenderer.setupResizeObserver: Invalid element or annotation',\n { lineAnnotation, element }\n );\n continue;\n }\n let pairs = elementMap.get(lineAnnotation);\n if (pairs == null) {\n pairs = [];\n elementMap.set(lineAnnotation, pairs);\n }\n pairs.push(element);\n }\n\n for (const [key, pair] of elementMap) {\n if (pair.length !== 2) {\n console.error(\n 'DiffFileRenderer.setupResizeObserver: Bad Pair',\n key,\n pair\n );\n continue;\n }\n const [container1, container2] = pair;\n const child1 = container1.firstElementChild;\n const child2 = container2.firstElementChild;\n if (\n !(container1 instanceof HTMLElement) ||\n !(container2 instanceof HTMLElement) ||\n !(child1 instanceof HTMLElement) ||\n !(child2 instanceof HTMLElement)\n ) {\n continue;\n }\n\n let item = observedNodes.get(child1);\n\n if (item != null) {\n this.observedNodes.set(child1, item);\n this.observedNodes.set(child2, item);\n observedNodes.delete(child1);\n observedNodes.delete(child2);\n continue;\n }\n\n item = {\n type: 'annotations',\n column1: {\n container: container1,\n child: child1,\n childHeight: child1.getBoundingClientRect().height,\n },\n column2: {\n container: container2,\n child: child2,\n childHeight: child2.getBoundingClientRect().height,\n },\n currentHeight: 'auto',\n };\n\n const newHeight = Math.max(\n item.column1.childHeight,\n item.column2.childHeight\n );\n this.applyNewHeight(item, newHeight);\n\n this.observedNodes.set(child1, item);\n this.observedNodes.set(child2, item);\n this.resizeObserver.observe(child1);\n this.resizeObserver.observe(child2);\n }\n }\n\n for (const element of observedNodes.keys()) {\n if (element.isConnected) {\n element.style.removeProperty('--diffs-column-content-width');\n element.style.removeProperty('--diffs-column-number-width');\n element.style.removeProperty('--diffs-column-width');\n if (element.parentElement instanceof HTMLElement) {\n element.parentElement.style.removeProperty(\n '--diffs-annotation-min-height'\n );\n }\n }\n this.resizeObserver.unobserve(element);\n }\n observedNodes.clear();\n }\n\n private handleResizeObserver = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { target, borderBoxSize, contentBoxSize } = entry;\n if (!(target instanceof HTMLElement)) {\n console.error(\n 'FileDiff.handleResizeObserver: Invalid element for ResizeObserver',\n entry\n );\n continue;\n }\n const item = this.observedNodes.get(target);\n if (item == null) {\n console.error(\n 'FileDiff.handleResizeObserver: Not a valid observed node',\n entry\n );\n continue;\n }\n if (item.type === 'annotations') {\n const column = (() => {\n if (target === item.column1.child) {\n return item.column1;\n }\n if (target === item.column2.child) {\n return item.column2;\n }\n return undefined;\n })();\n\n if (column == null) {\n console.error(\n `FileDiff.handleResizeObserver: Couldn't find a column for`,\n { item, target }\n );\n continue;\n }\n\n column.childHeight = borderBoxSize[0].blockSize;\n const newHeight = Math.max(\n item.column1.childHeight,\n item.column2.childHeight\n );\n this.applyNewHeight(item, newHeight);\n } else if (item.type === 'code') {\n const update: CodeColumnUpdate = [target, contentBoxSize[0].inlineSize];\n const updates = this.queuedUpdates.get(item) ?? [];\n updates.push(update);\n this.queuedUpdates.set(item, updates);\n }\n }\n this.handleColumnChange();\n };\n\n private handleColumnChange = () => {\n for (const [item, updates] of this.queuedUpdates) {\n for (const [target, targetInlineSize] of updates) {\n // FIXME(amadeus): This needs to be re-worked with display: contents,\n // not sure setting to auto is a good assumption most of the time...\n if (target === item.codeElement) {\n const inlineSize = Math.max(Math.floor(targetInlineSize), 0);\n if (inlineSize !== item.codeWidth) {\n const targetWidth = Math.max(inlineSize - item.numberWidth, 0);\n item.codeWidth = inlineSize === 0 ? 'auto' : inlineSize;\n item.codeElement.style.setProperty(\n '--diffs-column-content-width',\n `${targetWidth > 0 ? `${targetWidth}px` : 'auto'}`\n );\n item.codeElement.style.setProperty(\n '--diffs-column-width',\n `${typeof item.codeWidth === 'number' ? `${item.codeWidth}px` : 'auto'}`\n );\n }\n if (\n item.numberElement != null &&\n typeof item.codeWidth === 'number' &&\n item.numberWidth === 0\n ) {\n updates.push([\n item.numberElement,\n item.numberElement.getBoundingClientRect().width,\n ]);\n }\n } else if (target === item.numberElement) {\n const inlineSize = Math.max(Math.ceil(targetInlineSize), 0);\n if (inlineSize !== item.numberWidth) {\n item.numberWidth = inlineSize;\n item.codeElement.style.setProperty(\n '--diffs-column-number-width',\n `${item.numberWidth === 0 ? 'auto' : `${item.numberWidth}px`}`\n );\n // We probably need to update code width variable if\n // `numberWidth` changed\n if (item.codeWidth !== 'auto') {\n const targetWidth = Math.max(\n item.codeWidth - item.numberWidth,\n 0\n );\n item.codeElement.style.setProperty(\n '--diffs-column-content-width',\n `${targetWidth === 0 ? 'auto' : `${targetWidth}px`}`\n );\n }\n }\n }\n }\n }\n this.queuedUpdates.clear();\n };\n\n private applyNewHeight(item: ObservedAnnotationNodes, newHeight: number) {\n if (newHeight !== item.currentHeight) {\n item.currentHeight = Math.max(newHeight, 0);\n item.column1.container.style.setProperty(\n '--diffs-annotation-min-height',\n `${item.currentHeight}px`\n );\n item.column2.container.style.setProperty(\n '--diffs-annotation-min-height',\n `${item.currentHeight}px`\n );\n }\n }\n}\n"],"mappings":"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"}
@@ -27,6 +27,7 @@ declare class WorkerPoolManager {
27
27
  private fileCache;
28
28
  private diffCache;
29
29
  private _queuedBroadcast;
30
+ private lifecycleGeneration;
30
31
  constructor(options: WorkerPoolOptions, {
31
32
  langs,
32
33
  theme,
@@ -67,6 +68,9 @@ declare class WorkerPoolManager {
67
68
  highlightDiffAST(instance: DiffRendererInstance, diff: FileDiffMetadata): void;
68
69
  getPlainDiffAST(diff: FileDiffMetadata, startingLine: number, totalLines: number, expandedHunks?: Map<number, HunkExpansionRegion> | true, collapsedContextThreshold?: number): ThemedDiffResult | undefined;
69
70
  terminate(): void;
71
+ private isCurrentLifecycle;
72
+ private queueInitialization;
73
+ private cancelPendingAsyncWorkerTasks;
70
74
  private terminateWorkers;
71
75
  getStats(): WorkerStats;
72
76
  private submitTask;
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerPoolManager.d.ts","names":["LRUMapPkg","FileContents","FileDiffMetadata","HunkExpansionRegion","RenderDiffOptions","RenderDiffResult","RenderFileOptions","RenderFileResult","SupportedLanguages","ThemedDiffResult","ThemedFileResult","DiffRendererInstance","FileRendererInstance","WorkerInitializationRenderOptions","WorkerPoolOptions","WorkerRenderingOptions","WorkerStats","GetCachesResult","LRUMap","ThemeSubscriber","WorkerPoolManager","langs","theme","useTokenTransformer","lineDiffType","maxLineDiffLength","tokenizeMaxLineLength","preferredHighlighter","Partial","Promise","Map"],"sources":["../../src/worker/WorkerPoolManager.d.ts"],"sourcesContent":["import LRUMapPkg from 'lru_map';\nimport type { FileContents, FileDiffMetadata, HunkExpansionRegion, RenderDiffOptions, RenderDiffResult, RenderFileOptions, RenderFileResult, SupportedLanguages, ThemedDiffResult, ThemedFileResult } from '../types';\nimport type { DiffRendererInstance, FileRendererInstance, WorkerInitializationRenderOptions, WorkerPoolOptions, WorkerRenderingOptions, WorkerStats } from './types';\ninterface GetCachesResult {\n fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n}\ninterface ThemeSubscriber {\n rerender(): void;\n}\nexport declare class WorkerPoolManager {\n private options;\n private highlighter;\n private readonly preferredHighlighter;\n private renderOptions;\n private initialized;\n private workers;\n private taskQueue;\n private pendingTasks;\n private nextRequestId;\n private themeSubscribers;\n private workersFailed;\n private instanceRequestMap;\n private statSubscribers;\n private fileCache;\n private diffCache;\n private _queuedBroadcast;\n constructor(options: WorkerPoolOptions, { langs, theme, useTokenTransformer, lineDiffType, maxLineDiffLength, tokenizeMaxLineLength, preferredHighlighter }: WorkerInitializationRenderOptions);\n isWorkingPool(): boolean;\n getFileResultCache(file: FileContents): RenderFileResult | undefined;\n getDiffResultCache(diff: FileDiffMetadata): RenderDiffResult | undefined;\n inspectCaches(): GetCachesResult;\n evictFileFromCache(cacheKey: string): boolean;\n evictDiffFromCache(cacheKey: string): boolean;\n setRenderOptions({ theme, useTokenTransformer, lineDiffType, maxLineDiffLength, tokenizeMaxLineLength }: Partial<WorkerRenderingOptions>): Promise<void>;\n getFileRenderOptions(): RenderFileOptions;\n getDiffRenderOptions(): RenderDiffOptions;\n private setRenderOptionsOnWorkers;\n subscribeToThemeChanges(instance: ThemeSubscriber): () => void;\n unsubscribeToThemeChanges(instance: ThemeSubscriber): void;\n subscribeToStatChanges(callback: (stats: WorkerStats) => unknown): () => void;\n private queueBroadcastStateChanges;\n private _broadcastStateChanges;\n cleanUpPendingTasks(instance: FileRendererInstance | DiffRendererInstance): void;\n isInitialized(): boolean;\n initialize(languages?: SupportedLanguages[]): Promise<void>;\n private initializeWorkers;\n private drainQueue;\n highlightFileAST(instance: FileRendererInstance, file: FileContents): void;\n getPlainFileAST(file: FileContents, startingLine: number, totalLines: number, lines?: string[]): ThemedFileResult | undefined;\n highlightDiffAST(instance: DiffRendererInstance, diff: FileDiffMetadata): void;\n getPlainDiffAST(diff: FileDiffMetadata, startingLine: number, totalLines: number, expandedHunks?: Map<number, HunkExpansionRegion> | true, collapsedContextThreshold?: number): ThemedDiffResult | undefined;\n terminate(): void;\n private terminateWorkers;\n getStats(): WorkerStats;\n private submitTask;\n private resolveLanguagesAndExecuteTask;\n private handleWorkerMessage;\n private _queuedDrain;\n private queueDrain;\n private assignWorkerToTask;\n private cleanWorkerAndTask;\n private executeTask;\n private maybeAttachCustomExtensions;\n private syncCustomExtensionVersion;\n private getAvailableWorker;\n private generateRequestId;\n}\nexport {};\n//# sourceMappingURL=WorkerPoolManager.d.ts.map"],"mappings":"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"}
1
+ {"version":3,"file":"WorkerPoolManager.d.ts","names":["LRUMapPkg","FileContents","FileDiffMetadata","HunkExpansionRegion","RenderDiffOptions","RenderDiffResult","RenderFileOptions","RenderFileResult","SupportedLanguages","ThemedDiffResult","ThemedFileResult","DiffRendererInstance","FileRendererInstance","WorkerInitializationRenderOptions","WorkerPoolOptions","WorkerRenderingOptions","WorkerStats","GetCachesResult","LRUMap","ThemeSubscriber","WorkerPoolManager","langs","theme","useTokenTransformer","lineDiffType","maxLineDiffLength","tokenizeMaxLineLength","preferredHighlighter","Partial","Promise","Map"],"sources":["../../src/worker/WorkerPoolManager.d.ts"],"sourcesContent":["import LRUMapPkg from 'lru_map';\nimport type { FileContents, FileDiffMetadata, HunkExpansionRegion, RenderDiffOptions, RenderDiffResult, RenderFileOptions, RenderFileResult, SupportedLanguages, ThemedDiffResult, ThemedFileResult } from '../types';\nimport type { DiffRendererInstance, FileRendererInstance, WorkerInitializationRenderOptions, WorkerPoolOptions, WorkerRenderingOptions, WorkerStats } from './types';\ninterface GetCachesResult {\n fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n}\ninterface ThemeSubscriber {\n rerender(): void;\n}\nexport declare class WorkerPoolManager {\n private options;\n private highlighter;\n private readonly preferredHighlighter;\n private renderOptions;\n private initialized;\n private workers;\n private taskQueue;\n private pendingTasks;\n private nextRequestId;\n private themeSubscribers;\n private workersFailed;\n private instanceRequestMap;\n private statSubscribers;\n private fileCache;\n private diffCache;\n private _queuedBroadcast;\n private lifecycleGeneration;\n constructor(options: WorkerPoolOptions, { langs, theme, useTokenTransformer, lineDiffType, maxLineDiffLength, tokenizeMaxLineLength, preferredHighlighter }: WorkerInitializationRenderOptions);\n isWorkingPool(): boolean;\n getFileResultCache(file: FileContents): RenderFileResult | undefined;\n getDiffResultCache(diff: FileDiffMetadata): RenderDiffResult | undefined;\n inspectCaches(): GetCachesResult;\n evictFileFromCache(cacheKey: string): boolean;\n evictDiffFromCache(cacheKey: string): boolean;\n setRenderOptions({ theme, useTokenTransformer, lineDiffType, maxLineDiffLength, tokenizeMaxLineLength }: Partial<WorkerRenderingOptions>): Promise<void>;\n getFileRenderOptions(): RenderFileOptions;\n getDiffRenderOptions(): RenderDiffOptions;\n private setRenderOptionsOnWorkers;\n subscribeToThemeChanges(instance: ThemeSubscriber): () => void;\n unsubscribeToThemeChanges(instance: ThemeSubscriber): void;\n subscribeToStatChanges(callback: (stats: WorkerStats) => unknown): () => void;\n private queueBroadcastStateChanges;\n private _broadcastStateChanges;\n cleanUpPendingTasks(instance: FileRendererInstance | DiffRendererInstance): void;\n isInitialized(): boolean;\n initialize(languages?: SupportedLanguages[]): Promise<void>;\n private initializeWorkers;\n private drainQueue;\n highlightFileAST(instance: FileRendererInstance, file: FileContents): void;\n getPlainFileAST(file: FileContents, startingLine: number, totalLines: number, lines?: string[]): ThemedFileResult | undefined;\n highlightDiffAST(instance: DiffRendererInstance, diff: FileDiffMetadata): void;\n getPlainDiffAST(diff: FileDiffMetadata, startingLine: number, totalLines: number, expandedHunks?: Map<number, HunkExpansionRegion> | true, collapsedContextThreshold?: number): ThemedDiffResult | undefined;\n terminate(): void;\n private isCurrentLifecycle;\n private queueInitialization;\n private cancelPendingAsyncWorkerTasks;\n private terminateWorkers;\n getStats(): WorkerStats;\n private submitTask;\n private resolveLanguagesAndExecuteTask;\n private handleWorkerMessage;\n private _queuedDrain;\n private queueDrain;\n private assignWorkerToTask;\n private cleanWorkerAndTask;\n private executeTask;\n private maybeAttachCustomExtensions;\n private syncCustomExtensionVersion;\n private getAvailableWorker;\n private generateRequestId;\n}\nexport {};\n//# sourceMappingURL=WorkerPoolManager.d.ts.map"],"mappings":"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"}
@@ -20,6 +20,11 @@ import LRUMapPkg from "lru_map";
20
20
 
21
21
  //#region src/worker/WorkerPoolManager.ts
22
22
  const IGNORE_RESPONSE = Symbol("IGNORE_RESPONSE");
23
+ var WorkerPoolTerminatedError = class extends Error {
24
+ constructor() {
25
+ super("WorkerPoolManager: operation canceled because the pool terminated");
26
+ }
27
+ };
23
28
  var WorkerPoolManager = class {
24
29
  highlighter;
25
30
  preferredHighlighter;
@@ -36,6 +41,7 @@ var WorkerPoolManager = class {
36
41
  fileCache;
37
42
  diffCache;
38
43
  _queuedBroadcast;
44
+ lifecycleGeneration = 0;
39
45
  constructor(options, { langs, theme = DEFAULT_THEMES, useTokenTransformer = false, lineDiffType = "word-alt", maxLineDiffLength = 1e3, tokenizeMaxLineLength = 1e3, preferredHighlighter = "shiki-js" }) {
40
46
  this.options = options;
41
47
  this.preferredHighlighter = preferredHighlighter;
@@ -48,7 +54,7 @@ var WorkerPoolManager = class {
48
54
  };
49
55
  this.fileCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);
50
56
  this.diffCache = new LRUMapPkg.LRUMap(options.totalASTLRUCacheSize ?? 100);
51
- this.initialize(langs);
57
+ this.queueInitialization(langs);
52
58
  }
53
59
  isWorkingPool() {
54
60
  return !this.workersFailed;
@@ -81,34 +87,43 @@ var WorkerPoolManager = class {
81
87
  }
82
88
  }
83
89
  async setRenderOptions({ theme = DEFAULT_THEMES, useTokenTransformer = false, lineDiffType = "word-alt", maxLineDiffLength = 1e3, tokenizeMaxLineLength = 1e3 }) {
84
- const newRenderOptions = {
85
- theme,
86
- useTokenTransformer,
87
- lineDiffType,
88
- maxLineDiffLength,
89
- tokenizeMaxLineLength
90
- };
91
- if (!this.isInitialized()) await this.initialize();
92
- if (areDiffRenderOptionsEqual(newRenderOptions, this.renderOptions)) return;
93
- const themeNames = getThemes(theme);
94
- let resolvedThemes = [];
95
- if (!areThemesEqual(newRenderOptions.theme, this.renderOptions.theme)) if (hasResolvedThemes(themeNames)) resolvedThemes = getResolvedThemes(themeNames);
96
- else resolvedThemes = await resolveThemes(themeNames);
97
- if (this.highlighter != null) {
98
- attachResolvedThemes(resolvedThemes, this.highlighter);
99
- await this.setRenderOptionsOnWorkers(newRenderOptions, resolvedThemes);
100
- } else {
101
- const [highlighter] = await Promise.all([getSharedHighlighter({
102
- themes: themeNames,
103
- langs: ["text"],
104
- preferredHighlighter: this.preferredHighlighter
105
- }), this.setRenderOptionsOnWorkers(newRenderOptions, resolvedThemes)]);
106
- this.highlighter = highlighter;
90
+ const { lifecycleGeneration } = this;
91
+ try {
92
+ const newRenderOptions = {
93
+ theme,
94
+ useTokenTransformer,
95
+ lineDiffType,
96
+ maxLineDiffLength,
97
+ tokenizeMaxLineLength
98
+ };
99
+ if (!this.isInitialized()) await this.initialize();
100
+ if (!this.isCurrentLifecycle(lifecycleGeneration) || areDiffRenderOptionsEqual(newRenderOptions, this.renderOptions)) return;
101
+ const themeNames = getThemes(theme);
102
+ let resolvedThemes = [];
103
+ if (!areThemesEqual(newRenderOptions.theme, this.renderOptions.theme)) if (hasResolvedThemes(themeNames)) resolvedThemes = getResolvedThemes(themeNames);
104
+ else resolvedThemes = await resolveThemes(themeNames);
105
+ if (!this.isCurrentLifecycle(lifecycleGeneration)) return;
106
+ if (this.highlighter != null) {
107
+ attachResolvedThemes(resolvedThemes, this.highlighter);
108
+ await this.setRenderOptionsOnWorkers(newRenderOptions, resolvedThemes);
109
+ } else {
110
+ const [highlighter] = await Promise.all([getSharedHighlighter({
111
+ themes: themeNames,
112
+ langs: ["text"],
113
+ preferredHighlighter: this.preferredHighlighter
114
+ }), this.setRenderOptionsOnWorkers(newRenderOptions, resolvedThemes)]);
115
+ if (!this.isCurrentLifecycle(lifecycleGeneration)) return;
116
+ this.highlighter = highlighter;
117
+ }
118
+ if (!this.isCurrentLifecycle(lifecycleGeneration)) return;
119
+ this.renderOptions = newRenderOptions;
120
+ this.diffCache.clear();
121
+ this.fileCache.clear();
122
+ for (const instance of this.themeSubscribers) instance.rerender();
123
+ } catch (error) {
124
+ if (error instanceof WorkerPoolTerminatedError || !this.isCurrentLifecycle(lifecycleGeneration)) return;
125
+ throw error;
107
126
  }
108
- this.renderOptions = newRenderOptions;
109
- this.diffCache.clear();
110
- this.fileCache.clear();
111
- for (const instance of this.themeSubscribers) instance.rerender();
112
127
  }
113
128
  getFileRenderOptions() {
114
129
  const { tokenizeMaxLineLength, theme, useTokenTransformer } = this.renderOptions;
@@ -197,6 +212,7 @@ var WorkerPoolManager = class {
197
212
  async initialize(languages = []) {
198
213
  if (this.initialized === true) return;
199
214
  else if (this.initialized === false) {
215
+ const { lifecycleGeneration } = this;
200
216
  this.initialized = new Promise((resolve, reject) => {
201
217
  (async () => {
202
218
  try {
@@ -204,17 +220,26 @@ var WorkerPoolManager = class {
204
220
  let resolvedThemes = [];
205
221
  if (hasResolvedThemes(themes)) resolvedThemes = getResolvedThemes(themes);
206
222
  else resolvedThemes = await resolveThemes(themes);
223
+ if (!this.isCurrentLifecycle(lifecycleGeneration)) {
224
+ resolve();
225
+ return;
226
+ }
207
227
  let resolvedLanguages = [];
208
228
  if (hasResolvedLanguages(languages)) resolvedLanguages = getResolvedLanguages(languages);
209
229
  else resolvedLanguages = await resolveLanguages(languages);
230
+ if (!this.isCurrentLifecycle(lifecycleGeneration)) {
231
+ resolve();
232
+ return;
233
+ }
210
234
  const [highlighter] = await Promise.all([getSharedHighlighter({
211
235
  themes,
212
236
  langs: ["text", ...languages],
213
237
  preferredHighlighter: this.preferredHighlighter
214
238
  }), this.initializeWorkers(resolvedThemes, resolvedLanguages)]);
215
- if (this.initialized === false) {
239
+ if (!this.isCurrentLifecycle(lifecycleGeneration)) {
216
240
  this.terminateWorkers();
217
- throw new Error("WorkerPoolManager: workers failed to initialize");
241
+ resolve();
242
+ return;
218
243
  }
219
244
  this.highlighter = highlighter;
220
245
  this.initialized = true;
@@ -224,6 +249,10 @@ var WorkerPoolManager = class {
224
249
  this.queueBroadcastStateChanges();
225
250
  resolve();
226
251
  } catch (e) {
252
+ if (e instanceof WorkerPoolTerminatedError || !this.isCurrentLifecycle(lifecycleGeneration)) {
253
+ resolve();
254
+ return;
255
+ }
227
256
  this.initialized = false;
228
257
  this.workersFailed = true;
229
258
  this.queueBroadcastStateChanges();
@@ -305,7 +334,7 @@ var WorkerPoolManager = class {
305
334
  }
306
335
  getPlainFileAST(file, startingLine, totalLines, lines) {
307
336
  if (this.highlighter == null) {
308
- this.initialize();
337
+ this.queueInitialization();
309
338
  return;
310
339
  }
311
340
  return renderFileWithHighlighter(file, this.highlighter, this.renderOptions, {
@@ -333,6 +362,8 @@ var WorkerPoolManager = class {
333
362
  }) : void 0;
334
363
  }
335
364
  terminate() {
365
+ this.lifecycleGeneration++;
366
+ this.cancelPendingAsyncWorkerTasks();
336
367
  this.terminateWorkers();
337
368
  this.fileCache.clear();
338
369
  this.diffCache.clear();
@@ -344,6 +375,18 @@ var WorkerPoolManager = class {
344
375
  this.workersFailed = false;
345
376
  this.queueBroadcastStateChanges();
346
377
  }
378
+ isCurrentLifecycle(lifecycleGeneration) {
379
+ return this.lifecycleGeneration === lifecycleGeneration;
380
+ }
381
+ queueInitialization(languages) {
382
+ this.initialize(languages).catch((error) => {
383
+ console.error(error);
384
+ });
385
+ }
386
+ cancelPendingAsyncWorkerTasks() {
387
+ const error = new WorkerPoolTerminatedError();
388
+ for (const task of this.pendingTasks.values()) if ("reject" in task) task.reject(error);
389
+ }
347
390
  terminateWorkers() {
348
391
  for (const managedWorker of this.workers) managedWorker.worker.terminate();
349
392
  this.workers.length = 0;
@@ -366,7 +409,7 @@ var WorkerPoolManager = class {
366
409
  };
367
410
  }
368
411
  submitTask(instance, request) {
369
- if (this.initialized === false) this.initialize();
412
+ if (this.initialized === false) this.queueInitialization();
370
413
  const id = this.generateRequestId();
371
414
  const requestStart = Date.now();
372
415
  const task = (() => {
@@ -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: RenderFileTask | RenderDiffTask","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 { 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\ninterface GetCachesResult {\n fileCache: LRUMapPkg.LRUMap<string, RenderFileResult>;\n diffCache: LRUMapPkg.LRUMap<string, RenderDiffResult>;\n}\n\ninterface ManagedWorker {\n worker: Worker;\n request_id: string | undefined;\n initialized: boolean;\n langs: Set<SupportedLanguages>;\n customExtensionsVersion: number;\n}\n\ninterface ThemeSubscriber {\n rerender(): void;\n}\n\nexport class WorkerPoolManager {\n private highlighter: DiffsHighlighter | undefined;\n private readonly preferredHighlighter: HighlighterTypes;\n private renderOptions: WorkerRenderingOptions;\n private initialized: Promise<void> | boolean = false;\n private workers: ManagedWorker[] = [];\n private taskQueue = new Map<\n FileRendererInstance | DiffRendererInstance,\n RenderDiffTask | RenderFileTask\n >();\n private pendingTasks = new Map<WorkerRequestId, AllWorkerTasks>();\n private nextRequestId = 0;\n private themeSubscribers = new Set<ThemeSubscriber>();\n private workersFailed = false;\n private instanceRequestMap = new Map<\n FileRendererInstance | DiffRendererInstance,\n string\n >();\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\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 void this.initialize(langs);\n }\n\n isWorkingPool(): boolean {\n return !this.workersFailed;\n }\n\n getFileResultCache(file: FileContents): RenderFileResult | undefined {\n return file.cacheKey != null\n ? this.fileCache.get(file.cacheKey)\n : undefined;\n }\n\n getDiffResultCache(diff: FileDiffMetadata): RenderDiffResult | undefined {\n return diff.cacheKey != null\n ? this.diffCache.get(diff.cacheKey)\n : undefined;\n }\n\n inspectCaches(): GetCachesResult {\n const { fileCache, diffCache } = this;\n return { fileCache, diffCache };\n }\n\n evictFileFromCache(cacheKey: string): boolean {\n try {\n return this.fileCache.delete(cacheKey) !== undefined;\n } finally {\n this.queueBroadcastStateChanges();\n }\n }\n\n 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 newRenderOptions: WorkerRenderingOptions = {\n theme,\n useTokenTransformer,\n lineDiffType,\n maxLineDiffLength,\n tokenizeMaxLineLength,\n };\n if (!this.isInitialized()) {\n await this.initialize();\n }\n if (areDiffRenderOptionsEqual(newRenderOptions, this.renderOptions)) {\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 (this.highlighter != null) {\n attachResolvedThemes(resolvedThemes, this.highlighter);\n await this.setRenderOptionsOnWorkers(newRenderOptions, resolvedThemes);\n } else {\n const [highlighter] = await Promise.all([\n getSharedHighlighter({\n themes: themeNames,\n langs: ['text'],\n preferredHighlighter: this.preferredHighlighter,\n }),\n this.setRenderOptionsOnWorkers(newRenderOptions, resolvedThemes),\n ]);\n this.highlighter = highlighter;\n }\n\n this.renderOptions = newRenderOptions;\n this.diffCache.clear();\n this.fileCache.clear();\n\n for (const instance of this.themeSubscribers) {\n instance.rerender();\n }\n }\n\n getFileRenderOptions(): RenderFileOptions {\n const { tokenizeMaxLineLength, theme, useTokenTransformer } =\n this.renderOptions;\n return { theme, useTokenTransformer, tokenizeMaxLineLength };\n }\n\n 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 // NOTE(amadeus): We intentionally ignore the normal pending requests\n // infra because these tasks should technically interrupt the normal\n // flow and should be processed by the worker when ready immediately\n this.pendingTasks.set(id, task);\n managedWorker.worker.postMessage(task.request);\n })\n );\n }\n await Promise.all(taskPromises);\n }\n\n 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 unsubscribeToThemeChanges(instance: ThemeSubscriber): void {\n this.themeSubscribers.delete(instance);\n this.queueBroadcastStateChanges();\n }\n\n 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 cleanUpPendingTasks(\n instance: FileRendererInstance | DiffRendererInstance\n ): void {\n this.taskQueue.delete(instance);\n const requestId = this.instanceRequestMap.get(instance);\n if (requestId != null) {\n this.pendingTasks.delete(requestId);\n this.instanceRequestMap.delete(instance);\n }\n this.queueBroadcastStateChanges();\n }\n\n isInitialized(): boolean {\n return this.initialized === true;\n }\n\n async initialize(languages: SupportedLanguages[] = []): Promise<void> {\n if (this.initialized === true) {\n return;\n } else if (this.initialized === false) {\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\n let resolvedLanguages: ResolvedLanguage[] = [];\n if (hasResolvedLanguages(languages)) {\n resolvedLanguages = getResolvedLanguages(languages);\n } else {\n resolvedLanguages = await resolveLanguages(languages);\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 we were terminated while initializing, we should probably kill\n // any workers that may have been created\n if (this.initialized === false) {\n this.terminateWorkers();\n throw new Error(\n 'WorkerPoolManager: workers failed to initialize'\n );\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 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 request_id: 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.pendingTasks.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.taskQueue.size === 0) {\n return;\n }\n for (const [instance, task] of this.taskQueue) {\n // If we have a request in progress for the same instance, we should wait\n // for it to finish\n if (this.instanceRequestMap.has(instance)) {\n continue;\n }\n const langs = getLangsFromTask(task);\n const availableWorker = this.getAvailableWorker(langs);\n if (availableWorker == null) {\n break;\n }\n this.assignWorkerToTask(task, availableWorker);\n void this.resolveLanguagesAndExecuteTask(availableWorker, task, langs);\n }\n this.queueBroadcastStateChanges();\n };\n\n highlightFileAST(instance: FileRendererInstance, file: FileContents): void {\n if (isFilePlainText(file)) {\n return;\n }\n // If we already have a task in progress for this same file content, we\n // should drop it\n for (const tasks of [this.taskQueue, this.pendingTasks.values()]) {\n for (const task of tasks) {\n if (\n 'instance' in task &&\n task.instance === instance &&\n task.request.type === 'file' &&\n areFilesEqual(file, task.request.file)\n ) {\n return;\n }\n }\n }\n this.submitTask(instance, { type: 'file', file });\n }\n\n getPlainFileAST(\n file: FileContents,\n startingLine: number,\n totalLines: number,\n lines?: string[]\n ): ThemedFileResult | undefined {\n if (this.highlighter == null) {\n void this.initialize();\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 highlightDiffAST(\n instance: DiffRendererInstance,\n diff: FileDiffMetadata\n ): void {\n if (isDiffPlainText(diff)) {\n return;\n }\n // If we already have a task in progress for this same diff content, we\n // should ignore executing it again\n for (const tasks of [this.taskQueue, this.pendingTasks.values()]) {\n for (const task of tasks) {\n if (\n 'instance' in task &&\n task.instance === instance &&\n task.request.type === 'diff' &&\n task.request.diff === diff\n ) {\n return;\n }\n }\n }\n this.submitTask(instance, { type: 'diff', diff });\n }\n\n 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 terminate(): void {\n this.terminateWorkers();\n this.fileCache.clear();\n this.diffCache.clear();\n this.instanceRequestMap.clear();\n this.taskQueue.clear();\n this.pendingTasks.clear();\n this.highlighter = undefined;\n this.initialized = false;\n this.workersFailed = false;\n this.queueBroadcastStateChanges();\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 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((w) => w.request_id != null).length,\n queuedTasks: this.taskQueue.size,\n pendingTasks: this.pendingTasks.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 void this.initialize();\n }\n\n const id = this.generateRequestId();\n const requestStart = Date.now();\n const task: RenderFileTask | RenderDiffTask = (() => {\n switch (request.type) {\n case 'file':\n return {\n type: 'file',\n id,\n request: { ...request, id },\n instance: instance as FileRendererInstance,\n requestStart,\n };\n case 'diff':\n return {\n type: 'diff',\n id,\n request: { ...request, id },\n instance: instance as DiffRendererInstance,\n requestStart,\n };\n }\n })();\n\n this.taskQueue.set(instance, task);\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 this.executeTask(availableWorker, task);\n } catch {\n this.cleanWorkerAndTask(availableWorker, task);\n }\n }\n\n private handleWorkerMessage(\n managedWorker: ManagedWorker,\n response: WorkerResponse\n ): void {\n const task = this.pendingTasks.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 {\n task.instance.onHighlightError(error);\n }\n throw error;\n } else {\n // If we've gotten a newer request from the same instance, we should\n // ignore this response either because it's out of order or because we\n // have a newer more important request\n if (\n 'instance' in task &&\n this.instanceRequestMap.get(task.instance) !== response.id\n ) {\n throw IGNORE_RESPONSE;\n }\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 const { instance, request } = task;\n this.syncCustomExtensionVersion(managedWorker, request);\n if (request.file.cacheKey != null) {\n this.fileCache.set(request.file.cacheKey, { result, options });\n }\n instance.onHighlightSuccess(request.file, 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 const { instance, request } = task;\n this.syncCustomExtensionVersion(managedWorker, request);\n if (request.diff.cacheKey != null) {\n this.diffCache.set(request.diff.cacheKey, { result, options });\n }\n instance.onHighlightSuccess(request.diff, 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);\n this.queueBroadcastStateChanges();\n if (this.taskQueue.size > 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.request_id = task.id;\n if ('instance' in task) {\n this.taskQueue.delete(task.instance);\n this.instanceRequestMap.set(task.instance, task.id);\n }\n this.pendingTasks.set(task.id, task);\n }\n\n private cleanWorkerAndTask(\n managedWorker: ManagedWorker,\n task?: AllWorkerTasks\n ) {\n managedWorker.request_id = undefined;\n if (task != null) {\n if ('instance' in task) {\n this.instanceRequestMap.delete(task.instance);\n }\n this.pendingTasks.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 this.assignWorkerToTask(task, managedWorker);\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 this.cleanWorkerAndTask(managedWorker, task);\n console.error('Failed to post message to worker:', error);\n if ('instance' in task) {\n task.instance.onHighlightError(error);\n } else if ('reject' in task) {\n task.reject(error as Error);\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 (managedWorker.request_id != null || !managedWorker.initialized) {\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 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"],"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: RenderFileTask | RenderDiffTask","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 { 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 request_id: string | undefined;\n initialized: boolean;\n langs: Set<SupportedLanguages>;\n customExtensionsVersion: number;\n}\n\ninterface ThemeSubscriber {\n rerender(): void;\n}\n\nexport class WorkerPoolManager {\n private highlighter: DiffsHighlighter | undefined;\n private readonly preferredHighlighter: HighlighterTypes;\n private renderOptions: WorkerRenderingOptions;\n private initialized: Promise<void> | boolean = false;\n private workers: ManagedWorker[] = [];\n private taskQueue = new Map<\n FileRendererInstance | DiffRendererInstance,\n RenderDiffTask | RenderFileTask\n >();\n private pendingTasks = new Map<WorkerRequestId, AllWorkerTasks>();\n private nextRequestId = 0;\n private themeSubscribers = new Set<ThemeSubscriber>();\n private workersFailed = false;\n private instanceRequestMap = new Map<\n FileRendererInstance | DiffRendererInstance,\n string\n >();\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 isWorkingPool(): boolean {\n return !this.workersFailed;\n }\n\n getFileResultCache(file: FileContents): RenderFileResult | undefined {\n return file.cacheKey != null\n ? this.fileCache.get(file.cacheKey)\n : undefined;\n }\n\n getDiffResultCache(diff: FileDiffMetadata): RenderDiffResult | undefined {\n return diff.cacheKey != null\n ? this.diffCache.get(diff.cacheKey)\n : undefined;\n }\n\n inspectCaches(): GetCachesResult {\n const { fileCache, diffCache } = this;\n return { fileCache, diffCache };\n }\n\n evictFileFromCache(cacheKey: string): boolean {\n try {\n return this.fileCache.delete(cacheKey) !== undefined;\n } finally {\n this.queueBroadcastStateChanges();\n }\n }\n\n 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 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 !this.isCurrentLifecycle(lifecycleGeneration) ||\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 (!this.isCurrentLifecycle(lifecycleGeneration)) {\n return;\n }\n\n if (this.highlighter != null) {\n attachResolvedThemes(resolvedThemes, this.highlighter);\n await this.setRenderOptionsOnWorkers(newRenderOptions, resolvedThemes);\n } else {\n const [highlighter] = await Promise.all([\n getSharedHighlighter({\n themes: themeNames,\n langs: ['text'],\n preferredHighlighter: this.preferredHighlighter,\n }),\n this.setRenderOptionsOnWorkers(newRenderOptions, resolvedThemes),\n ]);\n if (!this.isCurrentLifecycle(lifecycleGeneration)) {\n return;\n }\n this.highlighter = highlighter;\n }\n\n if (!this.isCurrentLifecycle(lifecycleGeneration)) {\n return;\n }\n\n this.renderOptions = newRenderOptions;\n this.diffCache.clear();\n this.fileCache.clear();\n\n for (const instance of this.themeSubscribers) {\n instance.rerender();\n }\n } catch (error) {\n if (\n error instanceof WorkerPoolTerminatedError ||\n !this.isCurrentLifecycle(lifecycleGeneration)\n ) {\n return;\n }\n throw error;\n }\n }\n\n getFileRenderOptions(): RenderFileOptions {\n const { tokenizeMaxLineLength, theme, useTokenTransformer } =\n this.renderOptions;\n return { theme, useTokenTransformer, tokenizeMaxLineLength };\n }\n\n 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 // NOTE(amadeus): We intentionally ignore the normal pending requests\n // infra because these tasks should technically interrupt the normal\n // flow and should be processed by the worker when ready immediately\n this.pendingTasks.set(id, task);\n managedWorker.worker.postMessage(task.request);\n })\n );\n }\n await Promise.all(taskPromises);\n }\n\n 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 unsubscribeToThemeChanges(instance: ThemeSubscriber): void {\n this.themeSubscribers.delete(instance);\n this.queueBroadcastStateChanges();\n }\n\n 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 cleanUpPendingTasks(\n instance: FileRendererInstance | DiffRendererInstance\n ): void {\n this.taskQueue.delete(instance);\n const requestId = this.instanceRequestMap.get(instance);\n if (requestId != null) {\n this.pendingTasks.delete(requestId);\n this.instanceRequestMap.delete(instance);\n }\n this.queueBroadcastStateChanges();\n }\n\n isInitialized(): boolean {\n return this.initialized === true;\n }\n\n 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 request_id: 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.pendingTasks.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.taskQueue.size === 0) {\n return;\n }\n for (const [instance, task] of this.taskQueue) {\n // If we have a request in progress for the same instance, we should wait\n // for it to finish\n if (this.instanceRequestMap.has(instance)) {\n continue;\n }\n const langs = getLangsFromTask(task);\n const availableWorker = this.getAvailableWorker(langs);\n if (availableWorker == null) {\n break;\n }\n this.assignWorkerToTask(task, availableWorker);\n void this.resolveLanguagesAndExecuteTask(availableWorker, task, langs);\n }\n this.queueBroadcastStateChanges();\n };\n\n highlightFileAST(instance: FileRendererInstance, file: FileContents): void {\n if (isFilePlainText(file)) {\n return;\n }\n // If we already have a task in progress for this same file content, we\n // should drop it\n for (const tasks of [this.taskQueue, this.pendingTasks.values()]) {\n for (const task of tasks) {\n if (\n 'instance' in task &&\n task.instance === instance &&\n task.request.type === 'file' &&\n areFilesEqual(file, task.request.file)\n ) {\n return;\n }\n }\n }\n this.submitTask(instance, { type: 'file', file });\n }\n\n 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 highlightDiffAST(\n instance: DiffRendererInstance,\n diff: FileDiffMetadata\n ): void {\n if (isDiffPlainText(diff)) {\n return;\n }\n // If we already have a task in progress for this same diff content, we\n // should ignore executing it again\n for (const tasks of [this.taskQueue, this.pendingTasks.values()]) {\n for (const task of tasks) {\n if (\n 'instance' in task &&\n task.instance === instance &&\n task.request.type === 'diff' &&\n task.request.diff === diff\n ) {\n return;\n }\n }\n }\n this.submitTask(instance, { type: 'diff', diff });\n }\n\n 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 terminate(): void {\n this.lifecycleGeneration++;\n this.cancelPendingAsyncWorkerTasks();\n this.terminateWorkers();\n this.fileCache.clear();\n this.diffCache.clear();\n this.instanceRequestMap.clear();\n this.taskQueue.clear();\n this.pendingTasks.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 cancelPendingAsyncWorkerTasks(): void {\n const error = new WorkerPoolTerminatedError();\n for (const task of this.pendingTasks.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 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((w) => w.request_id != null).length,\n queuedTasks: this.taskQueue.size,\n pendingTasks: this.pendingTasks.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 id = this.generateRequestId();\n const requestStart = Date.now();\n const task: RenderFileTask | RenderDiffTask = (() => {\n switch (request.type) {\n case 'file':\n return {\n type: 'file',\n id,\n request: { ...request, id },\n instance: instance as FileRendererInstance,\n requestStart,\n };\n case 'diff':\n return {\n type: 'diff',\n id,\n request: { ...request, id },\n instance: instance as DiffRendererInstance,\n requestStart,\n };\n }\n })();\n\n this.taskQueue.set(instance, task);\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 this.executeTask(availableWorker, task);\n } catch {\n this.cleanWorkerAndTask(availableWorker, task);\n }\n }\n\n private handleWorkerMessage(\n managedWorker: ManagedWorker,\n response: WorkerResponse\n ): void {\n const task = this.pendingTasks.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 {\n task.instance.onHighlightError(error);\n }\n throw error;\n } else {\n // If we've gotten a newer request from the same instance, we should\n // ignore this response either because it's out of order or because we\n // have a newer more important request\n if (\n 'instance' in task &&\n this.instanceRequestMap.get(task.instance) !== response.id\n ) {\n throw IGNORE_RESPONSE;\n }\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 const { instance, request } = task;\n this.syncCustomExtensionVersion(managedWorker, request);\n if (request.file.cacheKey != null) {\n this.fileCache.set(request.file.cacheKey, { result, options });\n }\n instance.onHighlightSuccess(request.file, 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 const { instance, request } = task;\n this.syncCustomExtensionVersion(managedWorker, request);\n if (request.diff.cacheKey != null) {\n this.diffCache.set(request.diff.cacheKey, { result, options });\n }\n instance.onHighlightSuccess(request.diff, 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);\n this.queueBroadcastStateChanges();\n if (this.taskQueue.size > 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.request_id = task.id;\n if ('instance' in task) {\n this.taskQueue.delete(task.instance);\n this.instanceRequestMap.set(task.instance, task.id);\n }\n this.pendingTasks.set(task.id, task);\n }\n\n private cleanWorkerAndTask(\n managedWorker: ManagedWorker,\n task?: AllWorkerTasks\n ) {\n managedWorker.request_id = undefined;\n if (task != null) {\n if ('instance' in task) {\n this.instanceRequestMap.delete(task.instance);\n }\n this.pendingTasks.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 this.assignWorkerToTask(task, managedWorker);\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 this.cleanWorkerAndTask(managedWorker, task);\n console.error('Failed to post message to worker:', error);\n if ('instance' in task) {\n task.instance.onHighlightError(error);\n } else if ('reject' in task) {\n task.reject(error as Error);\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 (managedWorker.request_id != null || !managedWorker.initialized) {\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 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"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4DA,MAAM,kBAAkB,OAAO,kBAAkB;AAEjD,IAAM,4BAAN,cAAwC,MAAM;CAC5C,cAAc;AACZ,QAAM,oEAAoE;;;AAqB9E,IAAa,oBAAb,MAA+B;CAC7B,AAAQ;CACR,AAAiB;CACjB,AAAQ;CACR,AAAQ,cAAuC;CAC/C,AAAQ,UAA2B,EAAE;CACrC,AAAQ,4BAAY,IAAI,KAGrB;CACH,AAAQ,+BAAe,IAAI,KAAsC;CACjE,AAAQ,gBAAgB;CACxB,AAAQ,mCAAmB,IAAI,KAAsB;CACrD,AAAQ,gBAAgB;CACxB,AAAQ,qCAAqB,IAAI,KAG9B;CACH,AAAQ,kCAAkB,IAAI,KAAsC;CACpE,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,AAAQ,sBAAsB;CAE9B,YACE,AAAQA,SACR,EACE,OACA,QAAQ,gBACR,sBAAsB,OACtB,eAAe,YACf,oBAAoB,KACpB,wBAAwB,KACxB,uBAAuB,cAEzB;EAVQ;AAWR,OAAK,uBAAuB;AAC5B,OAAK,gBAAgB;GACnB;GACA;GACA;GACA;GACA;GACD;AACD,OAAK,YAAY,IAAI,UAAU,OAAO,QAAQ,wBAAwB,IAAI;AAC1E,OAAK,YAAY,IAAI,UAAU,OAAO,QAAQ,wBAAwB,IAAI;AAC1E,OAAK,oBAAoB,MAAM;;CAGjC,gBAAyB;AACvB,SAAO,CAAC,KAAK;;CAGf,mBAAmB,MAAkD;AACnE,SAAO,KAAK,YAAY,OACpB,KAAK,UAAU,IAAI,KAAK,SAAS,GACjC;;CAGN,mBAAmB,MAAsD;AACvE,SAAO,KAAK,YAAY,OACpB,KAAK,UAAU,IAAI,KAAK,SAAS,GACjC;;CAGN,gBAAiC;EAC/B,MAAM,EAAE,WAAW,cAAc;AACjC,SAAO;GAAE;GAAW;GAAW;;CAGjC,mBAAmB,UAA2B;AAC5C,MAAI;AACF,UAAO,KAAK,UAAU,OAAO,SAAS,KAAK;YACnC;AACR,QAAK,4BAA4B;;;CAIrC,mBAAmB,UAA2B;AAC5C,MAAI;AACF,UAAO,KAAK,UAAU,OAAO,SAAS,KAAK;YACnC;AACR,QAAK,4BAA4B;;;CAIrC,MAAM,iBAAiB,EACrB,QAAQ,gBACR,sBAAsB,OACtB,eAAe,YACf,oBAAoB,KACpB,wBAAwB,OACyB;EACjD,MAAM,EAAE,wBAAwB;AAChC,MAAI;GACF,MAAMC,mBAA2C;IAC/C;IACA;IACA;IACA;IACA;IACD;AACD,OAAI,CAAC,KAAK,eAAe,CACvB,OAAM,KAAK,YAAY;AAEzB,OACE,CAAC,KAAK,mBAAmB,oBAAoB,IAC7C,0BAA0B,kBAAkB,KAAK,cAAc,CAE/D;GAGF,MAAM,aAAa,UAAU,MAAM;GACnC,IAAIC,iBAA8C,EAAE;AACpD,OAAI,CAAC,eAAe,iBAAiB,OAAO,KAAK,cAAc,MAAM,CACnE,KAAI,kBAAkB,WAAW,CAC/B,kBAAiB,kBAAkB,WAAW;OAE9C,kBAAiB,MAAM,cAAc,WAAW;AAIpD,OAAI,CAAC,KAAK,mBAAmB,oBAAoB,CAC/C;AAGF,OAAI,KAAK,eAAe,MAAM;AAC5B,yBAAqB,gBAAgB,KAAK,YAAY;AACtD,UAAM,KAAK,0BAA0B,kBAAkB,eAAe;UACjE;IACL,MAAM,CAAC,eAAe,MAAM,QAAQ,IAAI,CACtC,qBAAqB;KACnB,QAAQ;KACR,OAAO,CAAC,OAAO;KACf,sBAAsB,KAAK;KAC5B,CAAC,EACF,KAAK,0BAA0B,kBAAkB,eAAe,CACjE,CAAC;AACF,QAAI,CAAC,KAAK,mBAAmB,oBAAoB,CAC/C;AAEF,SAAK,cAAc;;AAGrB,OAAI,CAAC,KAAK,mBAAmB,oBAAoB,CAC/C;AAGF,QAAK,gBAAgB;AACrB,QAAK,UAAU,OAAO;AACtB,QAAK,UAAU,OAAO;AAEtB,QAAK,MAAM,YAAY,KAAK,iBAC1B,UAAS,UAAU;WAEd,OAAO;AACd,OACE,iBAAiB,6BACjB,CAAC,KAAK,mBAAmB,oBAAoB,CAE7C;AAEF,SAAM;;;CAIV,uBAA0C;EACxC,MAAM,EAAE,uBAAuB,OAAO,wBACpC,KAAK;AACP,SAAO;GAAE;GAAO;GAAqB;GAAuB;;CAG9D,uBAA0C;AACxC,SAAO,EAAE,GAAG,KAAK,eAAe;;CAGlC,MAAc,0BACZ,eACA,gBACe;AACf,MAAI,KAAK,cACP;AAEF,MAAI,CAAC,KAAK,eAAe,CACvB,OAAM,KAAK,YAAY;EAEzB,MAAMC,eAAgC,EAAE;AACxC,OAAK,MAAM,iBAAiB,KAAK,SAAS;AACxC,OAAI,CAAC,cAAc,aAAa;AAC9B,YAAQ,IAAI,EAAE,eAAe,CAAC;AAC9B,UAAM,IAAI,MACR,qEACD;;AAEH,gBAAa,KACX,IAAI,SAAe,SAAS,WAAW;IACrC,MAAM,KAAK,KAAK,mBAAmB;IACnC,MAAMC,OAAmC;KACvC,MAAM;KACN;KACA,SAAS;MACP,MAAM;MACN;MACA;MACA;MACD;KACD;KACA;KACA,cAAc,KAAK,KAAK;KACzB;AAID,SAAK,aAAa,IAAI,IAAI,KAAK;AAC/B,kBAAc,OAAO,YAAY,KAAK,QAAQ;KAC9C,CACH;;AAEH,QAAM,QAAQ,IAAI,aAAa;;CAGjC,wBAAwB,UAAuC;AAC7D,OAAK,iBAAiB,IAAI,SAAS;AACnC,OAAK,4BAA4B;AACjC,eAAa;AACX,QAAK,0BAA0B,SAAS;AACxC,QAAK,4BAA4B;;;CAIrC,0BAA0B,UAAiC;AACzD,OAAK,iBAAiB,OAAO,SAAS;AACtC,OAAK,4BAA4B;;CAGnC,uBACE,UACY;AACZ,OAAK,gBAAgB,IAAI,SAAS;AAClC,WAAS,KAAK,UAAU,CAAC;AACzB,eAAa;AACX,QAAK,gBAAgB,OAAO,SAAS;;;CAIzC,AAAQ,6BAA6B;AACnC,MAAI,KAAK,oBAAoB,KAAM;AACnC,OAAK,mBAAmB,sBAAsB,KAAK,uBAAuB;;CAG5E,AAAQ,+BAA+B;AACrC,MAAI,KAAK,oBAAoB,MAAM;AACjC,wBAAqB,KAAK,iBAAiB;AAC3C,QAAK,mBAAmB;;EAE1B,MAAM,QAAQ,KAAK,UAAU;AAC7B,OAAK,MAAM,YAAY,KAAK,gBAC1B,UAAS,MAAM;;CAInB,oBACE,UACM;AACN,OAAK,UAAU,OAAO,SAAS;EAC/B,MAAM,YAAY,KAAK,mBAAmB,IAAI,SAAS;AACvD,MAAI,aAAa,MAAM;AACrB,QAAK,aAAa,OAAO,UAAU;AACnC,QAAK,mBAAmB,OAAO,SAAS;;AAE1C,OAAK,4BAA4B;;CAGnC,gBAAyB;AACvB,SAAO,KAAK,gBAAgB;;CAG9B,MAAM,WAAW,YAAkC,EAAE,EAAiB;AACpE,MAAI,KAAK,gBAAgB,KACvB;WACS,KAAK,gBAAgB,OAAO;GACrC,MAAM,EAAE,wBAAwB;AAChC,QAAK,cAAc,IAAI,SAAS,SAAS,WAAW;AAClD,KAAM,YAAY;AAChB,SAAI;MACF,MAAM,SAAS,UAAU,KAAK,cAAc,MAAM;MAClD,IAAIF,iBAA8C,EAAE;AACpD,UAAI,kBAAkB,OAAO,CAC3B,kBAAiB,kBAAkB,OAAO;UAE1C,kBAAiB,MAAM,cAAc,OAAO;AAE9C,UAAI,CAAC,KAAK,mBAAmB,oBAAoB,EAAE;AACjD,gBAAS;AACT;;MAGF,IAAIG,oBAAwC,EAAE;AAC9C,UAAI,qBAAqB,UAAU,CACjC,qBAAoB,qBAAqB,UAAU;UAEnD,qBAAoB,MAAM,iBAAiB,UAAU;AAEvD,UAAI,CAAC,KAAK,mBAAmB,oBAAoB,EAAE;AACjD,gBAAS;AACT;;MAGF,MAAM,CAAC,eAAe,MAAM,QAAQ,IAAI,CACtC,qBAAqB;OACnB;OACA,OAAO,CAAC,QAAQ,GAAG,UAAU;OAC7B,sBAAsB,KAAK;OAC5B,CAAC,EACF,KAAK,kBAAkB,gBAAgB,kBAAkB,CAC1D,CAAC;AAEF,UAAI,CAAC,KAAK,mBAAmB,oBAAoB,EAAE;AACjD,YAAK,kBAAkB;AACvB,gBAAS;AACT;;AAEF,WAAK,cAAc;AACnB,WAAK,cAAc;AACnB,WAAK,UAAU,OAAO;AACtB,WAAK,UAAU,OAAO;AACtB,WAAK,YAAY;AACjB,WAAK,4BAA4B;AACjC,eAAS;cACF,GAAG;AACV,UACE,aAAa,6BACb,CAAC,KAAK,mBAAmB,oBAAoB,EAC7C;AACA,gBAAS;AACT;;AAEF,WAAK,cAAc;AACnB,WAAK,gBAAgB;AACrB,WAAK,4BAA4B;AACjC,aAAO,EAAE;;QAET;KACJ;AACF,QAAK,4BAA4B;QAEjC,QAAO,KAAK;;CAIhB,MAAc,kBACZ,gBACA,mBACe;AACf,OAAK,gBAAgB;EACrB,MAAMC,eAAmC,EAAE;EAC3C,MAAM,yBAAyB,4BAA4B;EAC3D,MAAM,qBACJ,yBAAyB,IAAI,wBAAwB,GAAG;AAC1D,MAAI,KAAK,QAAQ,SAAS,EACxB,MAAK,kBAAkB;AAEzB,OAAK,IAAI,IAAI,GAAG,KAAK,KAAK,QAAQ,YAAY,IAAI,KAAK;GACrD,MAAM,SAAS,KAAK,QAAQ,eAAe;GAC3C,MAAMC,gBAA+B;IACnC;IACA,YAAY;IACZ,aAAa;IACb,OAAO,IAAI,IAAI,CAAC,QAAQ,GAAG,kBAAkB,KAAK,EAAE,WAAW,KAAK,CAAC,CAAC;IACtE,yBAAyB;IAC1B;AACD,UAAO,iBACL,YACC,UAAwC;AACvC,SAAK,oBAAoB,eAAe,MAAM,KAAK;KAEtD;AACD,UAAO,iBAAiB,UAAU,UAChC,QAAQ,MAAM,iBAAiB,OAAO,cAAc,CACrD;AACD,QAAK,QAAQ,KAAK,cAAc;AAChC,gBAAa,KACX,IAAI,SAAe,SAAS,WAAW;IACrC,MAAM,KAAK,KAAK,mBAAmB;IACnC,MAAMC,OAA6B;KACjC,MAAM;KACN;KACA,SAAS;MACP,MAAM;MACN;MACA,eAAe,KAAK;MACpB,sBAAsB,KAAK;MAC3B;MACA;MACA,yBACE,sBAAsB,OAAO,yBAAyB;MACxD;MACD;KACD,UAAU;AACR,oBAAc,cAAc;AAC5B,eAAS;;KAEX;KACA,cAAc,KAAK,KAAK;KACzB;AACD,SAAK,aAAa,IAAI,IAAI,KAAK;AAC/B,SAAK,YAAY,eAAe,KAAK;KACrC,CACH;;AAEH,QAAM,QAAQ,IAAI,aAAa;;CAGjC,AAAQ,mBAAmB;AACzB,OAAK,eAAe;AAGpB,MAAI,KAAK,gBAAgB,QAAQ,KAAK,UAAU,SAAS,EACvD;AAEF,OAAK,MAAM,CAAC,UAAU,SAAS,KAAK,WAAW;AAG7C,OAAI,KAAK,mBAAmB,IAAI,SAAS,CACvC;GAEF,MAAM,QAAQ,iBAAiB,KAAK;GACpC,MAAM,kBAAkB,KAAK,mBAAmB,MAAM;AACtD,OAAI,mBAAmB,KACrB;AAEF,QAAK,mBAAmB,MAAM,gBAAgB;AAC9C,GAAK,KAAK,+BAA+B,iBAAiB,MAAM,MAAM;;AAExE,OAAK,4BAA4B;;CAGnC,iBAAiB,UAAgC,MAA0B;AACzE,MAAI,gBAAgB,KAAK,CACvB;AAIF,OAAK,MAAM,SAAS,CAAC,KAAK,WAAW,KAAK,aAAa,QAAQ,CAAC,CAC9D,MAAK,MAAM,QAAQ,MACjB,KACE,cAAc,QACd,KAAK,aAAa,YAClB,KAAK,QAAQ,SAAS,UACtB,cAAc,MAAM,KAAK,QAAQ,KAAK,CAEtC;AAIN,OAAK,WAAW,UAAU;GAAE,MAAM;GAAQ;GAAM,CAAC;;CAGnD,gBACE,MACA,cACA,YACA,OAC8B;AAC9B,MAAI,KAAK,eAAe,MAAM;AAC5B,QAAK,qBAAqB;AAC1B;;AAEF,SAAO,0BACL,MACA,KAAK,aACL,KAAK,eACL;GAAE,gBAAgB;GAAM;GAAc;GAAY;GAAO,CAC1D;;CAGH,iBACE,UACA,MACM;AACN,MAAI,gBAAgB,KAAK,CACvB;AAIF,OAAK,MAAM,SAAS,CAAC,KAAK,WAAW,KAAK,aAAa,QAAQ,CAAC,CAC9D,MAAK,MAAM,QAAQ,MACjB,KACE,cAAc,QACd,KAAK,aAAa,YAClB,KAAK,QAAQ,SAAS,UACtB,KAAK,QAAQ,SAAS,KAEtB;AAIN,OAAK,WAAW,UAAU;GAAE,MAAM;GAAQ;GAAM,CAAC;;CAGnD,gBACE,MACA,cACA,YACA,eACA,2BAC8B;AAC9B,SAAO,KAAK,eAAe,OACvB,0BAA0B,MAAM,KAAK,aAAa,KAAK,eAAe;GACpE,gBAAgB;GAChB;GACA;GACA;GACA;GACD,CAAC,GACF;;CAGN,YAAkB;AAChB,OAAK;AACL,OAAK,+BAA+B;AACpC,OAAK,kBAAkB;AACvB,OAAK,UAAU,OAAO;AACtB,OAAK,UAAU,OAAO;AACtB,OAAK,mBAAmB,OAAO;AAC/B,OAAK,UAAU,OAAO;AACtB,OAAK,aAAa,OAAO;AACzB,OAAK,cAAc;AACnB,OAAK,cAAc;AACnB,OAAK,gBAAgB;AACrB,OAAK,4BAA4B;;CAGnC,AAAQ,mBAAmB,qBAAsC;AAC/D,SAAO,KAAK,wBAAwB;;CAGtC,AAAQ,oBAAoB,WAAwC;AAClE,EAAK,KAAK,WAAW,UAAU,CAAC,OAAO,UAAU;AAC/C,WAAQ,MAAM,MAAM;IACpB;;CAGJ,AAAQ,gCAAsC;EAC5C,MAAM,QAAQ,IAAI,2BAA2B;AAC7C,OAAK,MAAM,QAAQ,KAAK,aAAa,QAAQ,CAC3C,KAAI,YAAY,KACd,MAAK,OAAO,MAAM;;CAKxB,AAAQ,mBAAmB;AACzB,OAAK,MAAM,iBAAiB,KAAK,QAC/B,eAAc,OAAO,WAAW;AAElC,OAAK,QAAQ,SAAS;;CAGxB,WAAwB;AACtB,SAAO;GACL,qBAAqB;AACnB,QAAI,KAAK,gBAAgB,MACvB,QAAO;AAET,QAAI,KAAK,gBAAgB,KACvB,QAAO;AAET,WAAO;OACL;GACJ,cAAc,KAAK,QAAQ;GAC3B,eAAe,KAAK;GACpB,aAAa,KAAK,QAAQ,QAAQ,MAAM,EAAE,cAAc,KAAK,CAAC;GAC9D,aAAa,KAAK,UAAU;GAC5B,cAAc,KAAK,aAAa;GAChC,kBAAkB,KAAK,iBAAiB;GACxC,eAAe,KAAK,UAAU;GAC9B,eAAe,KAAK,UAAU;GAC/B;;CAWH,AAAQ,WACN,UACA,SACM;AACN,MAAI,KAAK,gBAAgB,MACvB,MAAK,qBAAqB;EAG5B,MAAM,KAAK,KAAK,mBAAmB;EACnC,MAAM,eAAe,KAAK,KAAK;EAC/B,MAAMC,cAA+C;AACnD,WAAQ,QAAQ,MAAhB;IACE,KAAK,OACH,QAAO;KACL,MAAM;KACN;KACA,SAAS;MAAE,GAAG;MAAS;MAAI;KACjB;KACV;KACD;IACH,KAAK,OACH,QAAO;KACL,MAAM;KACN;KACA,SAAS;MAAE,GAAG;MAAS;MAAI;KACjB;KACV;KACD;;MAEH;AAEJ,OAAK,UAAU,IAAI,UAAU,KAAK;AAClC,OAAK,YAAY;;CAGnB,MAAc,+BACZ,iBACA,MACA,OACe;AACf,MAAI;GAEF,MAAM,qBAAqB,MAAM,QAC9B,SAAS,CAAC,gBAAgB,MAAM,IAAI,KAAK,CAC3C;AAED,OAAI,mBAAmB,SAAS,EAC9B,KAAI,qBAAqB,mBAAmB,CAC1C,MAAK,QAAQ,oBACX,qBAAqB,mBAAmB;OAE1C,MAAK,QAAQ,oBACX,MAAM,iBAAiB,mBAAmB;AAGhD,QAAK,YAAY,iBAAiB,KAAK;UACjC;AACN,QAAK,mBAAmB,iBAAiB,KAAK;;;CAIlD,AAAQ,oBACN,eACA,UACM;EACN,MAAM,OAAO,KAAK,aAAa,IAAI,SAAS,GAAG;AAC/C,MAAI;AACF,OAAI,QAAQ,KAGV,OAAM;YACG,SAAS,SAAS,SAAS;IACpC,MAAM,QAAQ,IAAI,MAAM,SAAS,MAAM;AACvC,QAAI,SAAS,MACX,OAAM,QAAQ,SAAS;AAEzB,QAAI,YAAY,KACd,MAAK,OAAO,MAAM;QAElB,MAAK,SAAS,iBAAiB,MAAM;AAEvC,UAAM;UACD;AAIL,QACE,cAAc,QACd,KAAK,mBAAmB,IAAI,KAAK,SAAS,KAAK,SAAS,GAExD,OAAM;AAER,YAAQ,SAAS,aAAjB;KACE,KAAK;AACH,UAAI,KAAK,SAAS,aAChB,OAAM,IAAI,MAAM,gDAAgD;AAElE,WAAK,2BAA2B,eAAe,KAAK,QAAQ;AAC5D,WAAK,SAAS;AACd;KACF,KAAK;AACH,UAAI,KAAK,SAAS,qBAChB,OAAM,IAAI,MAAM,gDAAgD;AAElE,WAAK,SAAS;AACd;KACF,KAAK,QAAQ;AACX,UAAI,KAAK,SAAS,OAChB,OAAM,IAAI,MAAM,gDAAgD;MAElE,MAAM,EAAE,QAAQ,YAAY;MAC5B,MAAM,EAAE,UAAU,YAAY;AAC9B,WAAK,2BAA2B,eAAe,QAAQ;AACvD,UAAI,QAAQ,KAAK,YAAY,KAC3B,MAAK,UAAU,IAAI,QAAQ,KAAK,UAAU;OAAE;OAAQ;OAAS,CAAC;AAEhE,eAAS,mBAAmB,QAAQ,MAAM,QAAQ,QAAQ;AAC1D;;KAEF,KAAK,QAAQ;AACX,UAAI,KAAK,SAAS,OAChB,OAAM,IAAI,MAAM,gDAAgD;MAElE,MAAM,EAAE,QAAQ,YAAY;MAC5B,MAAM,EAAE,UAAU,YAAY;AAC9B,WAAK,2BAA2B,eAAe,QAAQ;AACvD,UAAI,QAAQ,KAAK,YAAY,KAC3B,MAAK,UAAU,IAAI,QAAQ,KAAK,UAAU;OAAE;OAAQ;OAAS,CAAC;AAEhE,eAAS,mBAAmB,QAAQ,MAAM,QAAQ,QAAQ;AAC1D;;;;WAIC,OAAO;AACd,OAAI,UAAU,gBACZ,SAAQ,MAAM,OAAO,MAAM,SAAS;;AAIxC,OAAK,mBAAmB,eAAe,KAAK;AAC5C,OAAK,4BAA4B;AACjC,MAAI,KAAK,UAAU,OAAO,EAGxB,MAAK,YAAY;;CAIrB,AAAQ;CACR,AAAQ,aAAa;AACnB,MAAI,KAAK,gBAAgB,KAAM;AAC/B,OAAK,eAAe,QAAQ,SAAS,CAAC,KAAK,KAAK,WAAW;AAC3D,OAAK,4BAA4B;;CAGnC,AAAQ,mBACN,MACA,eACA;AACA,gBAAc,aAAa,KAAK;AAChC,MAAI,cAAc,MAAM;AACtB,QAAK,UAAU,OAAO,KAAK,SAAS;AACpC,QAAK,mBAAmB,IAAI,KAAK,UAAU,KAAK,GAAG;;AAErD,OAAK,aAAa,IAAI,KAAK,IAAI,KAAK;;CAGtC,AAAQ,mBACN,eACA,MACA;AACA,gBAAc,aAAa;AAC3B,MAAI,QAAQ,MAAM;AAChB,OAAI,cAAc,KAChB,MAAK,mBAAmB,OAAO,KAAK,SAAS;AAE/C,QAAK,aAAa,OAAO,KAAK,GAAG;;;CAIrC,AAAQ,YACN,eACA,MACM;AACN,MAAI,2BAA2B,KAAK,QAAQ,CAC1C,MAAK,4BAA4B,eAAe,KAAK,QAAQ;AAE/D,OAAK,mBAAmB,MAAM,cAAc;AAC5C,OAAK,MAAM,QAAQ,iBAAiB,KAAK,CACvC,eAAc,MAAM,IAAI,KAAK;AAE/B,MAAI;AACF,iBAAc,OAAO,YAAY,KAAK,QAAQ;WACvC,OAAO;AACd,QAAK,mBAAmB,eAAe,KAAK;AAC5C,WAAQ,MAAM,qCAAqC,MAAM;AACzD,OAAI,cAAc,KAChB,MAAK,SAAS,iBAAiB,MAAM;YAC5B,YAAY,KACrB,MAAK,OAAO,MAAe;;AAG/B,OAAK,4BAA4B;;CAGnC,AAAQ,4BACN,eACA,SACM;AACN,MAAI,QAAQ,2BAA2B,KACrC;EAEF,MAAM,UAAU,4BAA4B;AAC5C,MAAI,cAAc,2BAA2B,QAC3C;AAEF,UAAQ,0BAA0B;AAClC,UAAQ,qBAAqB,wBAAwB;;CAGvD,AAAQ,2BACN,eACA,SACM;AACN,MAAI,QAAQ,2BAA2B,KACrC;AAEF,gBAAc,0BAA0B,QAAQ;;CAGlD,AAAQ,mBACN,OAC2B;EAC3B,IAAIC;AACJ,OAAK,MAAM,iBAAiB,KAAK,SAAS;AACxC,OAAI,cAAc,cAAc,QAAQ,CAAC,cAAc,YACrD;AAEF,YAAS;AACT,OAAI,MAAM,WAAW,EACnB;GAEF,IAAI,eAAe;AACnB,QAAK,MAAM,QAAQ,MACjB,KAAI,CAAC,cAAc,MAAM,IAAI,KAAK,EAAE;AAClC,mBAAe;AACf;;AAGJ,OAAI,aACF;;AAGJ,SAAO;;CAGT,AAAQ,oBAAqC;AAC3C,SAAO,OAAO,EAAE,KAAK;;;AAIzB,SAAS,2BACP,SAC4E;AAC5E,QACE,QAAQ,SAAS,gBACjB,QAAQ,SAAS,UACjB,QAAQ,SAAS;;AAIrB,SAAS,iBAAiB,MAA4C;CACpE,MAAM,wBAAQ,IAAI,KAAyB;AAC3C,KAAI,KAAK,SAAS,gBAAgB,KAAK,SAAS,qBAC9C,QAAO,EAAE;AAEX,SAAQ,KAAK,MAAb;EACE,KAAK;AACH,SAAM,IACJ,KAAK,QAAQ,KAAK,QAChB,wBAAwB,KAAK,QAAQ,KAAK,KAAK,CAClD;AACD;EAEF,KAAK;AACH,SAAM,IACJ,KAAK,QAAQ,KAAK,QAChB,wBAAwB,KAAK,QAAQ,KAAK,KAAK,CAClD;AACD,SAAM,IACJ,KAAK,QAAQ,KAAK,QAChB,wBAAwB,KAAK,QAAQ,KAAK,YAAY,IAAI,CAC7D;AACD;;AAGJ,OAAM,OAAO,OAAO;AACpB,QAAO,MAAM,KAAK,MAAM"}
@@ -1,18 +1,15 @@
1
1
  import { WorkerPoolManager } from "./WorkerPoolManager.js";
2
2
 
3
3
  //#region src/worker/getOrCreateWorkerPoolSingleton.ts
4
- let workerPoolSingletone;
4
+ let workerPoolSingleton;
5
5
  function getOrCreateWorkerPoolSingleton({ poolOptions, highlighterOptions }) {
6
- if (workerPoolSingletone == null) {
7
- workerPoolSingletone = new WorkerPoolManager(poolOptions, highlighterOptions);
8
- workerPoolSingletone.initialize();
9
- }
10
- return workerPoolSingletone;
6
+ workerPoolSingleton ??= new WorkerPoolManager(poolOptions, highlighterOptions);
7
+ return workerPoolSingleton;
11
8
  }
12
9
  function terminateWorkerPoolSingleton() {
13
- if (workerPoolSingletone == null) return;
14
- workerPoolSingletone.terminate();
15
- workerPoolSingletone = void 0;
10
+ if (workerPoolSingleton == null) return;
11
+ workerPoolSingleton.terminate();
12
+ workerPoolSingleton = void 0;
16
13
  }
17
14
 
18
15
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"getOrCreateWorkerPoolSingleton.js","names":["workerPoolSingletone: WorkerPoolManager | undefined"],"sources":["../../src/worker/getOrCreateWorkerPoolSingleton.ts"],"sourcesContent":["import type {\n WorkerInitializationRenderOptions,\n WorkerPoolOptions,\n} from './types';\nimport { WorkerPoolManager } from './WorkerPoolManager';\n\nlet workerPoolSingletone: WorkerPoolManager | undefined;\n\nexport interface SetupWorkerPoolProps {\n poolOptions: WorkerPoolOptions;\n highlighterOptions: WorkerInitializationRenderOptions;\n}\n\nexport function getOrCreateWorkerPoolSingleton({\n poolOptions,\n highlighterOptions,\n}: SetupWorkerPoolProps): WorkerPoolManager {\n if (workerPoolSingletone == null) {\n workerPoolSingletone = new WorkerPoolManager(\n poolOptions,\n highlighterOptions\n );\n void workerPoolSingletone.initialize();\n }\n return workerPoolSingletone;\n}\n\nexport function terminateWorkerPoolSingleton(): void {\n if (workerPoolSingletone == null) {\n return;\n }\n workerPoolSingletone.terminate();\n workerPoolSingletone = undefined;\n}\n"],"mappings":";;;AAMA,IAAIA;AAOJ,SAAgB,+BAA+B,EAC7C,aACA,sBAC0C;AAC1C,KAAI,wBAAwB,MAAM;AAChC,yBAAuB,IAAI,kBACzB,aACA,mBACD;AACD,EAAK,qBAAqB,YAAY;;AAExC,QAAO;;AAGT,SAAgB,+BAAqC;AACnD,KAAI,wBAAwB,KAC1B;AAEF,sBAAqB,WAAW;AAChC,wBAAuB"}
1
+ {"version":3,"file":"getOrCreateWorkerPoolSingleton.js","names":["workerPoolSingleton: WorkerPoolManager | undefined"],"sources":["../../src/worker/getOrCreateWorkerPoolSingleton.ts"],"sourcesContent":["import type {\n WorkerInitializationRenderOptions,\n WorkerPoolOptions,\n} from './types';\nimport { WorkerPoolManager } from './WorkerPoolManager';\n\nlet workerPoolSingleton: WorkerPoolManager | undefined;\n\nexport interface SetupWorkerPoolProps {\n poolOptions: WorkerPoolOptions;\n highlighterOptions: WorkerInitializationRenderOptions;\n}\n\nexport function getOrCreateWorkerPoolSingleton({\n poolOptions,\n highlighterOptions,\n}: SetupWorkerPoolProps): WorkerPoolManager {\n workerPoolSingleton ??= new WorkerPoolManager(\n poolOptions,\n highlighterOptions\n );\n return workerPoolSingleton;\n}\n\nexport function terminateWorkerPoolSingleton(): void {\n if (workerPoolSingleton == null) {\n return;\n }\n workerPoolSingleton.terminate();\n workerPoolSingleton = undefined;\n}\n"],"mappings":";;;AAMA,IAAIA;AAOJ,SAAgB,+BAA+B,EAC7C,aACA,sBAC0C;AAC1C,yBAAwB,IAAI,kBAC1B,aACA,mBACD;AACD,QAAO;;AAGT,SAAgB,+BAAqC;AACnD,KAAI,uBAAuB,KACzB;AAEF,qBAAoB,WAAW;AAC/B,uBAAsB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pierre/diffs",
3
- "version": "1.1.15",
3
+ "version": "1.1.17",
4
4
  "license": "apache-2.0",
5
5
  "files": [
6
6
  "dist",