@pierre/diffs 1.2.0-beta.5 → 1.2.0

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.
Files changed (97) hide show
  1. package/dist/components/CodeView.d.ts +19 -4
  2. package/dist/components/CodeView.d.ts.map +1 -1
  3. package/dist/components/CodeView.js +148 -32
  4. package/dist/components/CodeView.js.map +1 -1
  5. package/dist/components/File.d.ts +5 -0
  6. package/dist/components/File.d.ts.map +1 -1
  7. package/dist/components/File.js +54 -10
  8. package/dist/components/File.js.map +1 -1
  9. package/dist/components/FileDiff.d.ts +5 -1
  10. package/dist/components/FileDiff.d.ts.map +1 -1
  11. package/dist/components/FileDiff.js +56 -14
  12. package/dist/components/FileDiff.js.map +1 -1
  13. package/dist/components/FileStream.js +1 -0
  14. package/dist/components/FileStream.js.map +1 -1
  15. package/dist/components/UnresolvedFile.d.ts.map +1 -1
  16. package/dist/components/UnresolvedFile.js +1 -1
  17. package/dist/components/VirtualizedFile.d.ts +1 -0
  18. package/dist/components/VirtualizedFile.d.ts.map +1 -1
  19. package/dist/components/VirtualizedFile.js +19 -6
  20. package/dist/components/VirtualizedFile.js.map +1 -1
  21. package/dist/components/VirtualizedFileDiff.d.ts +6 -0
  22. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  23. package/dist/components/VirtualizedFileDiff.js +75 -35
  24. package/dist/components/VirtualizedFileDiff.js.map +1 -1
  25. package/dist/components/Virtualizer.js +1 -1
  26. package/dist/components/Virtualizer.js.map +1 -1
  27. package/dist/constants.js +0 -1
  28. package/dist/constants.js.map +1 -1
  29. package/dist/highlighter/shared_highlighter.js +14 -0
  30. package/dist/highlighter/shared_highlighter.js.map +1 -1
  31. package/dist/index.d.ts +5 -1
  32. package/dist/index.js +8 -4
  33. package/dist/managers/InteractionManager.d.ts.map +1 -1
  34. package/dist/managers/ResizeManager.d.ts +7 -2
  35. package/dist/managers/ResizeManager.d.ts.map +1 -1
  36. package/dist/managers/ResizeManager.js +52 -16
  37. package/dist/managers/ResizeManager.js.map +1 -1
  38. package/dist/react/CodeView.d.ts +1 -0
  39. package/dist/react/CodeView.d.ts.map +1 -1
  40. package/dist/react/CodeView.js +9 -0
  41. package/dist/react/CodeView.js.map +1 -1
  42. package/dist/renderers/DiffHunksRenderer.d.ts +2 -0
  43. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  44. package/dist/renderers/DiffHunksRenderer.js +34 -21
  45. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  46. package/dist/renderers/FileRenderer.d.ts +3 -0
  47. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  48. package/dist/renderers/FileRenderer.js +37 -23
  49. package/dist/renderers/FileRenderer.js.map +1 -1
  50. package/dist/style.js +1 -1
  51. package/dist/style.js.map +1 -1
  52. package/dist/types.d.ts +4 -3
  53. package/dist/types.d.ts.map +1 -1
  54. package/dist/utils/areDiffTargetsEqual.d.ts +7 -0
  55. package/dist/utils/areDiffTargetsEqual.d.ts.map +1 -0
  56. package/dist/utils/areDiffTargetsEqual.js +8 -0
  57. package/dist/utils/areDiffTargetsEqual.js.map +1 -0
  58. package/dist/utils/areFileRenderOptionsEqual.d.ts +7 -0
  59. package/dist/utils/areFileRenderOptionsEqual.d.ts.map +1 -0
  60. package/dist/utils/areFileRenderOptionsEqual.js +10 -0
  61. package/dist/utils/areFileRenderOptionsEqual.js.map +1 -0
  62. package/dist/utils/areWorkerStatsEqual.js +1 -1
  63. package/dist/utils/areWorkerStatsEqual.js.map +1 -1
  64. package/dist/utils/computeVirtualFileMetrics.d.ts +11 -0
  65. package/dist/utils/computeVirtualFileMetrics.d.ts.map +1 -0
  66. package/dist/utils/{resolveVirtualFileMetrics.js → computeVirtualFileMetrics.js} +7 -10
  67. package/dist/utils/computeVirtualFileMetrics.js.map +1 -0
  68. package/dist/utils/detachString.d.ts +6 -0
  69. package/dist/utils/detachString.d.ts.map +1 -0
  70. package/dist/utils/detachString.js +21 -0
  71. package/dist/utils/detachString.js.map +1 -0
  72. package/dist/utils/isStyleNode.d.ts +5 -0
  73. package/dist/utils/isStyleNode.d.ts.map +1 -0
  74. package/dist/utils/isStyleNode.js +10 -0
  75. package/dist/utils/isStyleNode.js.map +1 -0
  76. package/dist/utils/parsePatchFiles.d.ts +1 -7
  77. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  78. package/dist/utils/parsePatchFiles.js +180 -59
  79. package/dist/utils/parsePatchFiles.js.map +1 -1
  80. package/dist/utils/prefersReducedMotion.d.ts +5 -0
  81. package/dist/utils/prefersReducedMotion.d.ts.map +1 -0
  82. package/dist/utils/prefersReducedMotion.js +9 -0
  83. package/dist/utils/prefersReducedMotion.js.map +1 -0
  84. package/dist/worker/WorkerPoolManager.d.ts +33 -5
  85. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  86. package/dist/worker/WorkerPoolManager.js +278 -79
  87. package/dist/worker/WorkerPoolManager.js.map +1 -1
  88. package/dist/worker/types.d.ts +7 -3
  89. package/dist/worker/types.d.ts.map +1 -1
  90. package/dist/worker/worker-portable.js +9 -10
  91. package/dist/worker/worker-portable.js.map +1 -1
  92. package/dist/worker/worker.js +3 -1
  93. package/dist/worker/worker.js.map +1 -1
  94. package/package.json +2 -6
  95. package/dist/utils/resolveVirtualFileMetrics.d.ts +0 -10
  96. package/dist/utils/resolveVirtualFileMetrics.d.ts.map +0 -1
  97. package/dist/utils/resolveVirtualFileMetrics.js.map +0 -1
@@ -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 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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"}
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","RenderTaskInstance","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}\ntype RenderTaskInstance = FileRendererInstance | DiffRendererInstance;\nexport declare class WorkerPoolManager {\n private options;\n private highlighter;\n private readonly preferredHighlighter;\n private renderOptions;\n private renderOptionsVersion;\n private initialized;\n private workers;\n private queuedTasks;\n private queuedTaskByInstance;\n private taskByHighlightKey;\n private activeTaskById;\n private activeRequestByInstance;\n private nextRequestId;\n private themeSubscribers;\n private workersFailed;\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 cleanUpTasks(instance: RenderTaskInstance): void;\n isInitialized(): boolean;\n initialize(languages?: SupportedLanguages[]): Promise<void>;\n private initializeWorkers;\n private drainQueue;\n highlightFileAST(instance: FileRendererInstance, file: FileContents): void;\n primeFileHighlightCache(file: FileContents): void;\n getPlainFileAST(file: FileContents, startingLine: number, totalLines: number, lines?: string[]): ThemedFileResult | undefined;\n highlightDiffAST(instance: DiffRendererInstance, diff: FileDiffMetadata): void;\n primeDiffHighlightCache(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 cancelActiveWorkerTasks;\n private terminateWorkers;\n getStats(): WorkerStats;\n private submitTask;\n private submitCacheTask;\n private enqueueRenderTask;\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 getFileHighlightKey;\n private getDiffHighlightKey;\n private getHighlightKeyForRequest;\n private hasActiveRequest;\n private addInstanceToTask;\n private detachInstanceFromQueuedTasks;\n private detachInstanceFromRenderTask;\n private removeQueuedTask;\n private removeActiveTask;\n private clearQueuedInstanceRequests;\n private clearHighlightKey;\n private trackInstanceRequests;\n private clearInstanceRequests;\n private notifyFileInstances;\n private notifyDiffInstances;\n private notifyHighlightError;\n private hasMatchingFileInstanceTask;\n private hasMatchingDiffInstanceTask;\n private getTaskByHighlightKey;\n private iterateRenderTasks;\n private generateRequestId;\n}\nexport {};\n//# sourceMappingURL=WorkerPoolManager.d.ts.map"],"mappings":"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"}
@@ -4,11 +4,13 @@ import { attachResolvedThemes } from "../highlighter/themes/attachResolvedThemes
4
4
  import { getSharedHighlighter } from "../highlighter/shared_highlighter.js";
5
5
  import { getThemes } from "../utils/getThemes.js";
6
6
  import { hasResolvedThemes } from "../highlighter/themes/hasResolvedThemes.js";
7
+ import { areFileRenderOptionsEqual } from "../utils/areFileRenderOptionsEqual.js";
8
+ import { areFilesEqual } from "../utils/areFilesEqual.js";
7
9
  import { getCustomExtensionsMap, getCustomExtensionsVersion, getFiletypeFromFileName } from "../utils/getFiletypeFromFileName.js";
8
10
  import { isFilePlainText } from "../utils/isFilePlainText.js";
9
11
  import { renderFileWithHighlighter } from "../utils/renderFileWithHighlighter.js";
10
- import { areFilesEqual } from "../utils/areFilesEqual.js";
11
12
  import { areDiffRenderOptionsEqual } from "../utils/areDiffRenderOptionsEqual.js";
13
+ import { areDiffTargetsEqual } from "../utils/areDiffTargetsEqual.js";
12
14
  import { isDiffPlainText } from "../utils/isDiffPlainText.js";
13
15
  import { renderDiffWithHighlighter } from "../utils/renderDiffWithHighlighter.js";
14
16
  import { getResolvedLanguages } from "../highlighter/languages/getResolvedLanguages.js";
@@ -29,14 +31,17 @@ var WorkerPoolManager = class {
29
31
  highlighter;
30
32
  preferredHighlighter;
31
33
  renderOptions;
34
+ renderOptionsVersion = 0;
32
35
  initialized = false;
33
36
  workers = [];
34
- taskQueue = /* @__PURE__ */ new Map();
35
- pendingTasks = /* @__PURE__ */ new Map();
37
+ queuedTasks = [];
38
+ queuedTaskByInstance = /* @__PURE__ */ new Map();
39
+ taskByHighlightKey = /* @__PURE__ */ new Map();
40
+ activeTaskById = /* @__PURE__ */ new Map();
41
+ activeRequestByInstance = /* @__PURE__ */ new Map();
36
42
  nextRequestId = 0;
37
43
  themeSubscribers = /* @__PURE__ */ new Set();
38
44
  workersFailed = false;
39
- instanceRequestMap = /* @__PURE__ */ new Map();
40
45
  statSubscribers = /* @__PURE__ */ new Set();
41
46
  fileCache;
42
47
  diffCache;
@@ -117,6 +122,7 @@ var WorkerPoolManager = class {
117
122
  }
118
123
  if (!this.isCurrentLifecycle(lifecycleGeneration)) return;
119
124
  this.renderOptions = newRenderOptions;
125
+ this.renderOptionsVersion++;
120
126
  this.diffCache.clear();
121
127
  this.fileCache.clear();
122
128
  for (const instance of this.themeSubscribers) instance.rerender();
@@ -160,7 +166,7 @@ var WorkerPoolManager = class {
160
166
  reject,
161
167
  requestStart: Date.now()
162
168
  };
163
- this.pendingTasks.set(id, task);
169
+ this.activeTaskById.set(id, task);
164
170
  managedWorker.worker.postMessage(task.request);
165
171
  }));
166
172
  }
@@ -197,13 +203,17 @@ var WorkerPoolManager = class {
197
203
  const stats = this.getStats();
198
204
  for (const callback of this.statSubscribers) callback(stats);
199
205
  };
200
- cleanUpPendingTasks(instance) {
201
- this.taskQueue.delete(instance);
202
- const requestId = this.instanceRequestMap.get(instance);
206
+ cleanUpTasks(instance) {
207
+ this.detachInstanceFromQueuedTasks(instance);
208
+ const requestId = this.activeRequestByInstance.get(instance);
203
209
  if (requestId != null) {
204
- this.pendingTasks.delete(requestId);
205
- this.instanceRequestMap.delete(instance);
210
+ const task = this.activeTaskById.get(requestId);
211
+ if (isRenderTask(task)) {
212
+ this.detachInstanceFromRenderTask(task, instance);
213
+ if (!task.primeCache && task.instances.size === 0) this.removeActiveTask(task);
214
+ } else this.activeTaskById.delete(requestId);
206
215
  }
216
+ this.activeRequestByInstance.delete(instance);
207
217
  this.queueBroadcastStateChanges();
208
218
  }
209
219
  isInitialized() {
@@ -305,7 +315,7 @@ var WorkerPoolManager = class {
305
315
  reject,
306
316
  requestStart: Date.now()
307
317
  };
308
- this.pendingTasks.set(id, task);
318
+ this.activeTaskById.set(id, task);
309
319
  this.executeTask(managedWorker, task);
310
320
  }));
311
321
  }
@@ -313,25 +323,45 @@ var WorkerPoolManager = class {
313
323
  }
314
324
  drainQueue = () => {
315
325
  this._queuedDrain = void 0;
316
- if (this.initialized !== true || this.taskQueue.size === 0) return;
317
- for (const [instance, task] of this.taskQueue) {
318
- if (this.instanceRequestMap.has(instance)) continue;
326
+ if (this.initialized !== true || this.queuedTasks.length === 0) return;
327
+ for (let i = 0; i < this.queuedTasks.length;) {
328
+ const task = this.queuedTasks[i];
329
+ if (this.hasActiveRequest(task)) {
330
+ i++;
331
+ continue;
332
+ }
319
333
  const langs = getLangsFromTask(task);
320
334
  const availableWorker = this.getAvailableWorker(langs);
321
335
  if (availableWorker == null) break;
336
+ this.queuedTasks.splice(i, 1);
322
337
  this.assignWorkerToTask(task, availableWorker);
323
338
  this.resolveLanguagesAndExecuteTask(availableWorker, task, langs);
324
339
  }
325
340
  this.queueBroadcastStateChanges();
326
341
  };
327
342
  highlightFileAST(instance, file) {
328
- if (isFilePlainText(file)) return;
329
- for (const tasks of [this.taskQueue, this.pendingTasks.values()]) for (const task of tasks) if ("instance" in task && task.instance === instance && task.request.type === "file" && areFilesEqual(file, task.request.file)) return;
330
- this.submitTask(instance, {
343
+ const cachedResult = this.getFileResultCache(file);
344
+ if (isFilePlainText(file) || cachedResult != null && areFileRenderOptionsEqual(cachedResult.options, this.getFileRenderOptions())) return;
345
+ if (!this.hasMatchingFileInstanceTask(instance, file)) this.submitTask(instance, {
331
346
  type: "file",
332
347
  file
333
348
  });
334
349
  }
350
+ primeFileHighlightCache(file) {
351
+ if (file.cacheKey == null) {
352
+ console.warn(`WorkerPoolManager.primeFileHighlightCache: priming highlight cache requires file.cacheKey; skipping "${file.name}".`);
353
+ return;
354
+ }
355
+ const cachedResult = this.getFileResultCache(file);
356
+ const highlightKey = this.getFileHighlightKey(file);
357
+ if (highlightKey == null || isFilePlainText(file) || cachedResult != null && areFileRenderOptionsEqual(cachedResult.options, this.getFileRenderOptions())) return;
358
+ const existingTask = this.getTaskByHighlightKey(highlightKey);
359
+ if (existingTask != null) existingTask.primeCache = true;
360
+ else this.submitCacheTask({
361
+ type: "file",
362
+ file
363
+ }, highlightKey);
364
+ }
335
365
  getPlainFileAST(file, startingLine, totalLines, lines) {
336
366
  if (this.highlighter == null) {
337
367
  this.queueInitialization();
@@ -345,13 +375,28 @@ var WorkerPoolManager = class {
345
375
  });
346
376
  }
347
377
  highlightDiffAST(instance, diff) {
348
- if (isDiffPlainText(diff)) return;
349
- for (const tasks of [this.taskQueue, this.pendingTasks.values()]) for (const task of tasks) if ("instance" in task && task.instance === instance && task.request.type === "diff" && task.request.diff === diff) return;
350
- this.submitTask(instance, {
378
+ const cachedResult = this.getDiffResultCache(diff);
379
+ if (isDiffPlainText(diff) || cachedResult != null && areDiffRenderOptionsEqual(cachedResult.options, this.getDiffRenderOptions())) return;
380
+ if (!this.hasMatchingDiffInstanceTask(instance, diff)) this.submitTask(instance, {
351
381
  type: "diff",
352
382
  diff
353
383
  });
354
384
  }
385
+ primeDiffHighlightCache(diff) {
386
+ if (diff.cacheKey == null) {
387
+ console.warn(`WorkerPoolManager.primeDiffHighlightCache: priming highlight cache requires diff.cacheKey; skipping "${diff.prevName ?? diff.name}" -> "${diff.name}".`);
388
+ return;
389
+ }
390
+ const cachedResult = this.getDiffResultCache(diff);
391
+ const highlightKey = this.getDiffHighlightKey(diff);
392
+ if (highlightKey == null || isDiffPlainText(diff) || cachedResult != null && areDiffRenderOptionsEqual(cachedResult.options, this.getDiffRenderOptions())) return;
393
+ const existingTask = this.getTaskByHighlightKey(highlightKey);
394
+ if (existingTask != null) existingTask.primeCache = true;
395
+ else this.submitCacheTask({
396
+ type: "diff",
397
+ diff
398
+ }, highlightKey);
399
+ }
355
400
  getPlainDiffAST(diff, startingLine, totalLines, expandedHunks, collapsedContextThreshold) {
356
401
  return this.highlighter != null ? renderDiffWithHighlighter(diff, this.highlighter, this.renderOptions, {
357
402
  forcePlainText: true,
@@ -363,13 +408,15 @@ var WorkerPoolManager = class {
363
408
  }
364
409
  terminate() {
365
410
  this.lifecycleGeneration++;
366
- this.cancelPendingAsyncWorkerTasks();
411
+ this.cancelActiveWorkerTasks();
367
412
  this.terminateWorkers();
368
413
  this.fileCache.clear();
369
414
  this.diffCache.clear();
370
- this.instanceRequestMap.clear();
371
- this.taskQueue.clear();
372
- this.pendingTasks.clear();
415
+ this.activeRequestByInstance.clear();
416
+ this.queuedTasks.length = 0;
417
+ this.queuedTaskByInstance.clear();
418
+ this.taskByHighlightKey.clear();
419
+ this.activeTaskById.clear();
373
420
  this.highlighter = void 0;
374
421
  this.initialized = false;
375
422
  this.workersFailed = false;
@@ -383,9 +430,9 @@ var WorkerPoolManager = class {
383
430
  console.error(error);
384
431
  });
385
432
  }
386
- cancelPendingAsyncWorkerTasks() {
433
+ cancelActiveWorkerTasks() {
387
434
  const error = new WorkerPoolTerminatedError();
388
- for (const task of this.pendingTasks.values()) if ("reject" in task) task.reject(error);
435
+ for (const task of this.activeTaskById.values()) if ("reject" in task) task.reject(error);
389
436
  }
390
437
  terminateWorkers() {
391
438
  for (const managedWorker of this.workers) managedWorker.worker.terminate();
@@ -401,14 +448,57 @@ var WorkerPoolManager = class {
401
448
  totalWorkers: this.workers.length,
402
449
  workersFailed: this.workersFailed,
403
450
  busyWorkers: this.workers.filter((w) => w.request_id != null).length,
404
- queuedTasks: this.taskQueue.size,
405
- pendingTasks: this.pendingTasks.size,
451
+ queuedTasks: this.queuedTasks.length,
452
+ activeTasks: this.activeTaskById.size,
406
453
  themeSubscribers: this.themeSubscribers.size,
407
454
  fileCacheSize: this.fileCache.size,
408
455
  diffCacheSize: this.diffCache.size
409
456
  };
410
457
  }
411
458
  submitTask(instance, request) {
459
+ if (this.initialized === false) this.queueInitialization();
460
+ const highlightKey = this.getHighlightKeyForRequest(request);
461
+ const existingTask = highlightKey != null ? this.getTaskByHighlightKey(highlightKey) : void 0;
462
+ if (existingTask != null) {
463
+ this.detachInstanceFromQueuedTasks(instance, existingTask);
464
+ this.addInstanceToTask(existingTask, instance);
465
+ this.queueBroadcastStateChanges();
466
+ return;
467
+ }
468
+ this.detachInstanceFromQueuedTasks(instance);
469
+ const id = this.generateRequestId();
470
+ const requestStart = Date.now();
471
+ const task = (() => {
472
+ switch (request.type) {
473
+ case "file": return {
474
+ type: "file",
475
+ id,
476
+ request: {
477
+ ...request,
478
+ id
479
+ },
480
+ instances: new Set([instance]),
481
+ primeCache: false,
482
+ highlightKey,
483
+ requestStart
484
+ };
485
+ case "diff": return {
486
+ type: "diff",
487
+ id,
488
+ request: {
489
+ ...request,
490
+ id
491
+ },
492
+ instances: new Set([instance]),
493
+ primeCache: false,
494
+ highlightKey,
495
+ requestStart
496
+ };
497
+ }
498
+ })();
499
+ this.enqueueRenderTask(task, instance);
500
+ }
501
+ submitCacheTask(request, highlightKey) {
412
502
  if (this.initialized === false) this.queueInitialization();
413
503
  const id = this.generateRequestId();
414
504
  const requestStart = Date.now();
@@ -421,7 +511,9 @@ var WorkerPoolManager = class {
421
511
  ...request,
422
512
  id
423
513
  },
424
- instance,
514
+ instances: /* @__PURE__ */ new Set(),
515
+ primeCache: true,
516
+ highlightKey,
425
517
  requestStart
426
518
  };
427
519
  case "diff": return {
@@ -431,12 +523,19 @@ var WorkerPoolManager = class {
431
523
  ...request,
432
524
  id
433
525
  },
434
- instance,
526
+ instances: /* @__PURE__ */ new Set(),
527
+ primeCache: true,
528
+ highlightKey,
435
529
  requestStart
436
530
  };
437
531
  }
438
532
  })();
439
- this.taskQueue.set(instance, task);
533
+ this.enqueueRenderTask(task);
534
+ }
535
+ enqueueRenderTask(task, instance) {
536
+ this.queuedTasks.push(task);
537
+ if (instance != null) this.queuedTaskByInstance.set(instance, task);
538
+ if (task.highlightKey != null) this.taskByHighlightKey.set(task.highlightKey, task);
440
539
  this.queueDrain();
441
540
  }
442
541
  async resolveLanguagesAndExecuteTask(availableWorker, task, langs) {
@@ -444,57 +543,65 @@ var WorkerPoolManager = class {
444
543
  const workerMissingLangs = langs.filter((lang) => !availableWorker.langs.has(lang));
445
544
  if (workerMissingLangs.length > 0) if (hasResolvedLanguages(workerMissingLangs)) task.request.resolvedLanguages = getResolvedLanguages(workerMissingLangs);
446
545
  else task.request.resolvedLanguages = await resolveLanguages(workerMissingLangs);
546
+ if (!this.activeTaskById.has(task.id)) {
547
+ if (availableWorker.request_id === task.id) {
548
+ this.cleanWorkerAndTask(availableWorker, task);
549
+ this.queueBroadcastStateChanges();
550
+ if (this.queuedTasks.length > 0) this.queueDrain();
551
+ }
552
+ return;
553
+ }
447
554
  this.executeTask(availableWorker, task);
448
555
  } catch {
449
556
  this.cleanWorkerAndTask(availableWorker, task);
557
+ this.queueBroadcastStateChanges();
558
+ if (this.queuedTasks.length > 0) this.queueDrain();
450
559
  }
451
560
  }
452
561
  handleWorkerMessage(managedWorker, response) {
453
- const task = this.pendingTasks.get(response.id);
562
+ const task = this.activeTaskById.get(response.id);
454
563
  try {
455
564
  if (task == null) throw IGNORE_RESPONSE;
456
565
  else if (response.type === "error") {
457
566
  const error = new Error(response.error);
458
567
  if (response.stack) error.stack = response.stack;
459
568
  if ("reject" in task) task.reject(error);
460
- else task.instance.onHighlightError(error);
569
+ else if (isRenderTask(task)) this.notifyHighlightError(task, error);
570
+ else throw new Error("handleWorkerMessage: unknown task type");
461
571
  throw error;
462
- } else {
463
- if ("instance" in task && this.instanceRequestMap.get(task.instance) !== response.id) throw IGNORE_RESPONSE;
464
- switch (response.requestType) {
465
- case "initialize":
466
- if (task.type !== "initialize") throw new Error("handleWorkerMessage: task/response dont match");
467
- this.syncCustomExtensionVersion(managedWorker, task.request);
468
- task.resolve();
469
- break;
470
- case "set-render-options":
471
- if (task.type !== "set-render-options") throw new Error("handleWorkerMessage: task/response dont match");
472
- task.resolve();
473
- break;
474
- case "file": {
475
- if (task.type !== "file") throw new Error("handleWorkerMessage: task/response dont match");
476
- const { result, options } = response;
477
- const { instance, request } = task;
478
- this.syncCustomExtensionVersion(managedWorker, request);
479
- if (request.file.cacheKey != null) this.fileCache.set(request.file.cacheKey, {
480
- result,
481
- options
482
- });
483
- instance.onHighlightSuccess(request.file, result, options);
484
- break;
485
- }
486
- case "diff": {
487
- if (task.type !== "diff") throw new Error("handleWorkerMessage: task/response dont match");
488
- const { result, options } = response;
489
- const { instance, request } = task;
490
- this.syncCustomExtensionVersion(managedWorker, request);
491
- if (request.diff.cacheKey != null) this.diffCache.set(request.diff.cacheKey, {
492
- result,
493
- options
494
- });
495
- instance.onHighlightSuccess(request.diff, result, options);
496
- break;
497
- }
572
+ } else switch (response.requestType) {
573
+ case "initialize":
574
+ if (task.type !== "initialize") throw new Error("handleWorkerMessage: task/response dont match");
575
+ this.syncCustomExtensionVersion(managedWorker, task.request);
576
+ task.resolve();
577
+ break;
578
+ case "set-render-options":
579
+ if (task.type !== "set-render-options") throw new Error("handleWorkerMessage: task/response dont match");
580
+ task.resolve();
581
+ break;
582
+ case "file": {
583
+ if (task.type !== "file") throw new Error("handleWorkerMessage: task/response dont match");
584
+ const { result, options } = response;
585
+ const { request } = task;
586
+ this.syncCustomExtensionVersion(managedWorker, request);
587
+ if (request.file.cacheKey != null) this.fileCache.set(request.file.cacheKey, {
588
+ result,
589
+ options
590
+ });
591
+ this.notifyFileInstances(task, result, options);
592
+ break;
593
+ }
594
+ case "diff": {
595
+ if (task.type !== "diff") throw new Error("handleWorkerMessage: task/response dont match");
596
+ const { result, options } = response;
597
+ const { request } = task;
598
+ this.syncCustomExtensionVersion(managedWorker, request);
599
+ if (request.diff.cacheKey != null) this.diffCache.set(request.diff.cacheKey, {
600
+ result,
601
+ options
602
+ });
603
+ this.notifyDiffInstances(task, result, options);
604
+ break;
498
605
  }
499
606
  }
500
607
  } catch (error) {
@@ -502,7 +609,7 @@ var WorkerPoolManager = class {
502
609
  }
503
610
  this.cleanWorkerAndTask(managedWorker, task);
504
611
  this.queueBroadcastStateChanges();
505
- if (this.taskQueue.size > 0) this.queueDrain();
612
+ if (this.queuedTasks.length > 0) this.queueDrain();
506
613
  }
507
614
  _queuedDrain;
508
615
  queueDrain() {
@@ -512,30 +619,34 @@ var WorkerPoolManager = class {
512
619
  }
513
620
  assignWorkerToTask(task, managedWorker) {
514
621
  managedWorker.request_id = task.id;
515
- if ("instance" in task) {
516
- this.taskQueue.delete(task.instance);
517
- this.instanceRequestMap.set(task.instance, task.id);
622
+ if (isRenderTask(task)) {
623
+ this.clearQueuedInstanceRequests(task);
624
+ this.trackInstanceRequests(task);
518
625
  }
519
- this.pendingTasks.set(task.id, task);
626
+ this.activeTaskById.set(task.id, task);
520
627
  }
521
628
  cleanWorkerAndTask(managedWorker, task) {
522
629
  managedWorker.request_id = void 0;
523
630
  if (task != null) {
524
- if ("instance" in task) this.instanceRequestMap.delete(task.instance);
525
- this.pendingTasks.delete(task.id);
631
+ if (isRenderTask(task)) {
632
+ this.clearInstanceRequests(task);
633
+ this.clearHighlightKey(task);
634
+ }
635
+ this.activeTaskById.delete(task.id);
526
636
  }
527
637
  }
528
638
  executeTask(managedWorker, task) {
529
639
  if (shouldSyncCustomExtensions(task.request)) this.maybeAttachCustomExtensions(managedWorker, task.request);
530
- this.assignWorkerToTask(task, managedWorker);
640
+ if (!this.activeTaskById.has(task.id)) this.assignWorkerToTask(task, managedWorker);
531
641
  for (const lang of getLangsFromTask(task)) managedWorker.langs.add(lang);
532
642
  try {
533
643
  managedWorker.worker.postMessage(task.request);
534
644
  } catch (error) {
535
- this.cleanWorkerAndTask(managedWorker, task);
536
645
  console.error("Failed to post message to worker:", error);
537
- if ("instance" in task) task.instance.onHighlightError(error);
646
+ if (isRenderTask(task)) this.notifyHighlightError(task, error);
538
647
  else if ("reject" in task) task.reject(error);
648
+ this.cleanWorkerAndTask(managedWorker, task);
649
+ if (this.queuedTasks.length > 0) this.queueDrain();
539
650
  }
540
651
  this.queueBroadcastStateChanges();
541
652
  }
@@ -565,6 +676,88 @@ var WorkerPoolManager = class {
565
676
  }
566
677
  return worker;
567
678
  }
679
+ getFileHighlightKey(file) {
680
+ if (file.cacheKey == null) return;
681
+ return `file:${file.cacheKey}:${this.renderOptionsVersion}`;
682
+ }
683
+ getDiffHighlightKey(diff) {
684
+ if (diff.cacheKey == null) return;
685
+ return `diff:${diff.cacheKey}:${this.renderOptionsVersion}`;
686
+ }
687
+ getHighlightKeyForRequest(request) {
688
+ switch (request.type) {
689
+ case "file": return this.getFileHighlightKey(request.file);
690
+ case "diff": return this.getDiffHighlightKey(request.diff);
691
+ }
692
+ }
693
+ hasActiveRequest(task) {
694
+ for (const instance of getInstances(task)) if (this.activeRequestByInstance.has(instance)) return true;
695
+ return false;
696
+ }
697
+ addInstanceToTask(task, instance) {
698
+ if (task.type === "file") task.instances.add(instance);
699
+ else task.instances.add(instance);
700
+ if (this.activeTaskById.has(task.id)) this.activeRequestByInstance.set(instance, task.id);
701
+ else this.queuedTaskByInstance.set(instance, task);
702
+ }
703
+ detachInstanceFromQueuedTasks(instance, exceptTask) {
704
+ const task = this.queuedTaskByInstance.get(instance);
705
+ if (task == null || task === exceptTask) return;
706
+ this.queuedTaskByInstance.delete(instance);
707
+ this.detachInstanceFromRenderTask(task, instance);
708
+ if (!task.primeCache && task.instances.size === 0) this.removeQueuedTask(task);
709
+ }
710
+ detachInstanceFromRenderTask(task, instance) {
711
+ if (task.type === "file") task.instances.delete(instance);
712
+ else task.instances.delete(instance);
713
+ }
714
+ removeQueuedTask(task) {
715
+ const index = this.queuedTasks.indexOf(task);
716
+ if (index !== -1) this.queuedTasks.splice(index, 1);
717
+ this.clearQueuedInstanceRequests(task);
718
+ this.clearHighlightKey(task);
719
+ }
720
+ removeActiveTask(task) {
721
+ this.clearInstanceRequests(task);
722
+ this.clearHighlightKey(task);
723
+ this.activeTaskById.delete(task.id);
724
+ }
725
+ clearQueuedInstanceRequests(task) {
726
+ for (const instance of getInstances(task)) if (this.queuedTaskByInstance.get(instance) === task) this.queuedTaskByInstance.delete(instance);
727
+ }
728
+ clearHighlightKey(task) {
729
+ if (task.highlightKey != null && this.taskByHighlightKey.get(task.highlightKey) === task) this.taskByHighlightKey.delete(task.highlightKey);
730
+ }
731
+ trackInstanceRequests(task) {
732
+ for (const instance of getInstances(task)) this.activeRequestByInstance.set(instance, task.id);
733
+ }
734
+ clearInstanceRequests(task) {
735
+ for (const instance of getInstances(task)) if (this.activeRequestByInstance.get(instance) === task.id) this.activeRequestByInstance.delete(instance);
736
+ }
737
+ notifyFileInstances(task, result, options) {
738
+ for (const instance of task.instances) if (this.activeRequestByInstance.get(instance) === task.id) instance.onHighlightSuccess(task.request.file, result, options);
739
+ }
740
+ notifyDiffInstances(task, result, options) {
741
+ for (const instance of task.instances) if (this.activeRequestByInstance.get(instance) === task.id) instance.onHighlightSuccess(task.request.diff, result, options);
742
+ }
743
+ notifyHighlightError(task, error) {
744
+ for (const instance of getInstances(task)) if (this.activeRequestByInstance.get(instance) === task.id) instance.onHighlightError(error);
745
+ }
746
+ hasMatchingFileInstanceTask(instance, file) {
747
+ for (const task of this.iterateRenderTasks()) if (task.type === "file" && task.instances.has(instance) && areFilesEqual(file, task.request.file)) return true;
748
+ return false;
749
+ }
750
+ hasMatchingDiffInstanceTask(instance, diff) {
751
+ for (const task of this.iterateRenderTasks()) if (task.type === "diff" && task.instances.has(instance) && areDiffTargetsEqual(task.request.diff, diff)) return true;
752
+ return false;
753
+ }
754
+ getTaskByHighlightKey(highlightKey) {
755
+ return this.taskByHighlightKey.get(highlightKey);
756
+ }
757
+ *iterateRenderTasks() {
758
+ for (const task of this.queuedTasks) yield task;
759
+ for (const task of this.activeTaskById.values()) if (isRenderTask(task)) yield task;
760
+ }
568
761
  generateRequestId() {
569
762
  return `req_${++this.nextRequestId}`;
570
763
  }
@@ -587,6 +780,12 @@ function getLangsFromTask(task) {
587
780
  langs.delete("text");
588
781
  return Array.from(langs);
589
782
  }
783
+ function isRenderTask(task) {
784
+ return task?.type === "file" || task?.type === "diff";
785
+ }
786
+ function getInstances(task) {
787
+ return task.instances;
788
+ }
590
789
 
591
790
  //#endregion
592
791
  export { WorkerPoolManager };