@pierre/diffs 1.1.0-beta.10 → 1.1.0-beta.12

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 (49) hide show
  1. package/README.md +7 -18
  2. package/dist/components/File.d.ts.map +1 -1
  3. package/dist/components/VirtualizedFile.js +4 -3
  4. package/dist/components/VirtualizedFile.js.map +1 -1
  5. package/dist/components/VirtualizedFileDiff.js +5 -3
  6. package/dist/components/VirtualizedFileDiff.js.map +1 -1
  7. package/dist/components/Virtualizer.d.ts +3 -1
  8. package/dist/components/Virtualizer.d.ts.map +1 -1
  9. package/dist/components/Virtualizer.js +49 -24
  10. package/dist/components/Virtualizer.js.map +1 -1
  11. package/dist/highlighter/shared_highlighter.d.ts +4 -2
  12. package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
  13. package/dist/highlighter/shared_highlighter.js +3 -3
  14. package/dist/highlighter/shared_highlighter.js.map +1 -1
  15. package/dist/index.d.ts +2 -2
  16. package/dist/react/WorkerPoolContext.d.ts.map +1 -1
  17. package/dist/react/index.d.ts +2 -2
  18. package/dist/react/jsx.d.ts.map +1 -1
  19. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  20. package/dist/shiki-stream/stream.d.ts +1 -1
  21. package/dist/shiki-stream/stream.d.ts.map +1 -1
  22. package/dist/shiki-stream/stream.js.map +1 -1
  23. package/dist/shiki-stream/tokenizer.d.ts +1 -1
  24. package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
  25. package/dist/shiki-stream/tokenizer.js.map +1 -1
  26. package/dist/shiki-stream/types.d.ts +1 -1
  27. package/dist/shiki-stream/types.d.ts.map +1 -1
  28. package/dist/ssr/index.d.ts +2 -2
  29. package/dist/types.d.ts +3 -1
  30. package/dist/types.d.ts.map +1 -1
  31. package/dist/utils/createWindowFromScrollPosition.js +10 -4
  32. package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
  33. package/dist/utils/getHighlighterOptions.d.ts +7 -2
  34. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  35. package/dist/utils/getHighlighterOptions.js +3 -2
  36. package/dist/utils/getHighlighterOptions.js.map +1 -1
  37. package/dist/worker/WorkerPoolManager.d.ts +3 -1
  38. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  39. package/dist/worker/WorkerPoolManager.js +8 -3
  40. package/dist/worker/WorkerPoolManager.js.map +1 -1
  41. package/dist/worker/types.d.ts +3 -1
  42. package/dist/worker/types.d.ts.map +1 -1
  43. package/dist/worker/wasm-BlUZCxHM.js +10 -0
  44. package/dist/worker/wasm-BlUZCxHM.js.map +1 -0
  45. package/dist/worker/worker-portable.js +10526 -10094
  46. package/dist/worker/worker-portable.js.map +1 -1
  47. package/dist/worker/worker.js +27 -19
  48. package/dist/worker/worker.js.map +1 -1
  49. package/package.json +1 -3
@@ -1 +1 @@
1
- {"version":3,"file":"Virtualizer.js","names":["DEFAULT_VIRTUALIZER_CONFIG: VirtualizerConfig","top","bestAnchor: ScrollAnchor | undefined","fileOffset: number","fileTypeOffset: 'top' | 'bottom'","bestLineIndex: string | undefined","bestLineOffset: number | undefined"],"sources":["../../src/components/Virtualizer.ts"],"sourcesContent":["import { queueRender } from '../managers/UniversalRenderingManager';\nimport type { VirtualWindowSpecs } from '../types';\nimport { areVirtualWindowSpecsEqual } from '../utils/areVirtualWindowSpecsEqual';\nimport { createWindowFromScrollPosition } from '../utils/createWindowFromScrollPosition';\n\ninterface SubscribedInstance {\n onRender(dirty: boolean): boolean;\n reconcileHeights(): void;\n setVisibility(visible: boolean): void;\n}\n\ninterface ScrollAnchor {\n fileElement: HTMLElement;\n fileTypeOffset: 'top' | 'bottom';\n fileOffset: number;\n lineIndex: string | undefined;\n lineOffset: number | undefined;\n}\n\n// 800 seems like the healthy overscan required to\n// keep safari from blanking... if we catch it tho, maybe 900\nconst DEFAULT_OVERSCROLL_SIZE = 1000;\nconst INTERSECTION_OBSERVER_MARGIN = DEFAULT_OVERSCROLL_SIZE * 4;\nconst INTERSECTION_OBSERVER_THRESHOLD = [0, 0.000001, 0.99999, 1];\n\nexport interface VirtualizerConfig {\n overscrollSize: number;\n intersectionObserverMargin: number;\n resizeDebugging: boolean;\n}\n\nconst DEFAULT_VIRTUALIZER_CONFIG: VirtualizerConfig = {\n overscrollSize: DEFAULT_OVERSCROLL_SIZE,\n intersectionObserverMargin: INTERSECTION_OBSERVER_MARGIN,\n resizeDebugging: false,\n};\n\nlet lastSize = 0;\n\nexport class Virtualizer {\n static __STOP: boolean = false;\n static __lastScrollPosition = 0;\n\n public type = 'basic';\n public readonly config: VirtualizerConfig;\n private intersectionObserver: IntersectionObserver | undefined;\n private scrollTop: number = 0;\n private height: number = 0;\n private scrollHeight: number = 0;\n private windowSpecs: VirtualWindowSpecs = { top: 0, bottom: 0 };\n private root: HTMLElement | Document | undefined;\n\n private resizeObserver: ResizeObserver | undefined;\n private observers: Map<HTMLElement, SubscribedInstance> = new Map();\n private visibleInstances: Map<HTMLElement, SubscribedInstance> = new Map();\n private visibleInstancesDirty: boolean = false;\n private instancesChanged: Set<SubscribedInstance> = new Set();\n\n private scrollDirty = true;\n private heightDirty = true;\n private scrollHeightDirty = true;\n private renderedObservers = 0;\n private connectQueue: Map<HTMLElement, SubscribedInstance> = new Map();\n\n constructor(config?: Partial<VirtualizerConfig>) {\n this.config = { ...DEFAULT_VIRTUALIZER_CONFIG, ...config };\n }\n\n setup(root: HTMLElement | Document, contentContainer?: Element): void {\n if (this.root != null) {\n return;\n }\n this.root = root;\n this.resizeObserver = new ResizeObserver(this.handleContainerResize);\n this.intersectionObserver = new IntersectionObserver(\n this.handleIntersectionChange,\n {\n root: this.root,\n threshold: INTERSECTION_OBSERVER_THRESHOLD,\n rootMargin: `${this.config.intersectionObserverMargin}px 0px ${this.config.intersectionObserverMargin}px 0px`,\n // FIXME(amadeus): Figure out the other settings we'll want in here, or\n // if we should make them configurable...\n }\n );\n if (root instanceof Document) {\n this.setupWindow();\n } else {\n this.setupElement(contentContainer);\n }\n\n // FIXME(amadeus): Remove me before release\n window.__INSTANCE = this;\n window.__TOGGLE = () => {\n if (Virtualizer.__STOP) {\n Virtualizer.__STOP = false;\n const scroller = this.getScrollContainerElement() ?? window;\n scroller.scrollTo({ top: Virtualizer.__lastScrollPosition });\n queueRender(this.computeRenderRangeAndEmit);\n } else {\n Virtualizer.__lastScrollPosition = this.getScrollTop();\n Virtualizer.__STOP = true;\n }\n };\n for (const [container, instance] of this.connectQueue.entries()) {\n this.connect(container, instance);\n }\n this.connectQueue.clear();\n this.markDOMDirty();\n queueRender(this.computeRenderRangeAndEmit);\n }\n\n instanceChanged(instance: SubscribedInstance): void {\n this.instancesChanged.add(instance);\n queueRender(this.computeRenderRangeAndEmit);\n }\n\n getWindowSpecs(): VirtualWindowSpecs {\n if (this.windowSpecs.top === 0 && this.windowSpecs.bottom === 0) {\n this.windowSpecs = createWindowFromScrollPosition({\n scrollTop: this.getScrollTop(),\n height: this.getHeight(),\n scrollHeight: this.getScrollHeight(),\n fitPerfectly: false,\n overscrollSize: this.config.overscrollSize,\n });\n }\n return this.windowSpecs;\n }\n\n isInstanceVisible(elementTop: number, elementHeight: number): boolean {\n const scrollTop = this.getScrollTop();\n const height = this.getHeight();\n const margin = this.config.intersectionObserverMargin;\n const top = scrollTop - margin;\n const bottom = scrollTop + height + margin;\n return !(elementTop < top - elementHeight || elementTop > bottom);\n }\n\n private handleContainerResize = (entries: ResizeObserverEntry[]) => {\n if (this.root == null) return;\n let shouldQueueUpdate = false;\n for (const entry of entries) {\n const blockSize = entry.borderBoxSize[0].blockSize;\n if (this.root instanceof Document) {\n if (blockSize !== this.scrollHeight) {\n this.scrollHeightDirty = true;\n shouldQueueUpdate = true;\n if (this.config.resizeDebugging) {\n console.log('Virtualizer: content size change', {\n sizeChange: blockSize - lastSize,\n newSize: blockSize,\n });\n lastSize = blockSize;\n }\n }\n } else {\n if (entry.target === this.root) {\n if (blockSize !== this.height) {\n this.heightDirty = true;\n shouldQueueUpdate = true;\n }\n } else if (entry.target === this.root.firstElementChild) {\n this.scrollHeightDirty = true;\n shouldQueueUpdate = true;\n if (this.config.resizeDebugging) {\n console.log('Virtualizer: scroller size change', {\n sizeChange: blockSize - lastSize,\n newSize: blockSize,\n });\n lastSize = blockSize;\n }\n }\n }\n }\n\n if (shouldQueueUpdate) {\n queueRender(this.computeRenderRangeAndEmit);\n }\n };\n\n private setupWindow() {\n if (this.root == null || !(this.root instanceof Document)) {\n throw new Error('Virtualizer.setupWindow: Invalid setup method');\n }\n window.addEventListener('scroll', this.handleWindowScroll, {\n passive: true,\n });\n window.addEventListener('resize', this.handleWindowResize, {\n passive: true,\n });\n this.resizeObserver?.observe(this.root.documentElement);\n }\n\n private setupElement(contentContainer: Element | undefined) {\n if (this.root == null || this.root instanceof Document) {\n throw new Error('Virtualizer.setupElement: Invalid setup method');\n }\n this.root.addEventListener('scroll', this.handleElementScroll, {\n passive: true,\n });\n this.resizeObserver?.observe(this.root);\n contentContainer ??= this.root.firstElementChild ?? undefined;\n if (contentContainer != null) {\n this.resizeObserver?.observe(contentContainer);\n }\n }\n\n cleanUp(): void {\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = undefined;\n this.root = undefined;\n }\n\n getOffsetInScrollContainer(element: HTMLElement): number {\n return (\n this.getScrollTop() +\n getRelativeBoundingTop(element, this.getScrollContainerElement())\n );\n }\n\n connect(container: HTMLElement, instance: SubscribedInstance): () => void {\n if (this.observers.has(container)) {\n throw new Error('Virtualizer.connect: instance is already connected...');\n }\n // If we are racing against the intersectionObserver, then we should just\n // queue up the connection for when the observer does get set up\n if (this.intersectionObserver == null) {\n this.connectQueue.set(container, instance);\n } else {\n // FIXME(amadeus): Go through the connection phase a bit more closely...\n this.intersectionObserver.observe(container);\n this.observers.set(container, instance);\n this.instancesChanged.add(instance);\n this.markDOMDirty();\n queueRender(this.computeRenderRangeAndEmit);\n }\n return () => this.disconnect(container);\n }\n\n disconnect(container: HTMLElement): void {\n const instance = this.observers.get(container);\n this.connectQueue.delete(container);\n if (instance == null) {\n return;\n }\n this.intersectionObserver?.unobserve(container);\n this.observers.delete(container);\n this.markDOMDirty();\n queueRender(this.computeRenderRangeAndEmit);\n }\n\n private handleWindowResize = () => {\n if (Virtualizer.__STOP || window.innerHeight === this.height) {\n return;\n }\n this.heightDirty = true;\n queueRender(this.computeRenderRangeAndEmit);\n };\n\n private handleWindowScroll = () => {\n if (\n Virtualizer.__STOP ||\n this.root == null ||\n !(this.root instanceof Document)\n ) {\n return;\n }\n this.scrollDirty = true;\n queueRender(this.computeRenderRangeAndEmit);\n };\n\n private handleElementScroll = () => {\n if (\n Virtualizer.__STOP ||\n this.root == null ||\n this.root instanceof Document\n ) {\n return;\n }\n this.scrollDirty = true;\n queueRender(this.computeRenderRangeAndEmit);\n };\n\n private computeRenderRangeAndEmit = () => {\n if (Virtualizer.__STOP) {\n return;\n }\n const wrapperDirty = this.heightDirty || this.scrollHeightDirty;\n if (\n !this.scrollDirty &&\n !this.scrollHeightDirty &&\n !this.heightDirty &&\n this.renderedObservers === this.observers.size &&\n !this.visibleInstancesDirty &&\n this.instancesChanged.size === 0\n ) {\n // NOTE(amadeus): Is this a safe assumption/optimization?\n return;\n }\n\n // If we got an emitted update from a bunch of instances, we should skip\n // the window check first and attempt to render with existing logic first\n // and then queue up a corrected render after\n if (this.instancesChanged.size === 0) {\n const windowSpecs = createWindowFromScrollPosition({\n scrollTop: this.getScrollTop(),\n height: this.getHeight(),\n scrollHeight: this.getScrollHeight(),\n fitPerfectly: false,\n overscrollSize: this.config.overscrollSize,\n });\n if (\n areVirtualWindowSpecsEqual(this.windowSpecs, windowSpecs) &&\n this.renderedObservers === this.observers.size &&\n !this.visibleInstancesDirty &&\n this.instancesChanged.size === 0\n ) {\n return;\n }\n this.windowSpecs = windowSpecs;\n }\n this.visibleInstancesDirty = false;\n this.renderedObservers = this.observers.size;\n const anchor = this.getScrollAnchor(this.height);\n const updatedInstances = new Set<SubscribedInstance>();\n for (const instance of this.visibleInstances.values()) {\n if (instance.onRender(wrapperDirty)) {\n updatedInstances.add(instance);\n }\n }\n for (const instance of this.instancesChanged) {\n if (updatedInstances.has(instance)) continue;\n if (instance.onRender(wrapperDirty)) {\n updatedInstances.add(instance);\n }\n }\n\n this.scrollFix(anchor);\n // Scroll fix may have marked the dom as dirty, but if there instance\n // changes, we should definitely mark as dirty\n if (this.instancesChanged.size > 0) {\n this.markDOMDirty();\n }\n\n for (const instance of updatedInstances) {\n instance.reconcileHeights();\n }\n\n if (this.instancesChanged.size > 0 || wrapperDirty) {\n queueRender(this.computeRenderRangeAndEmit);\n }\n updatedInstances.clear();\n this.instancesChanged.clear();\n };\n\n private scrollFix(anchor: ScrollAnchor | undefined) {\n if (anchor == null) {\n return;\n }\n const scrollContainer = this.getScrollContainerElement();\n const { lineIndex, lineOffset, fileElement, fileOffset, fileTypeOffset } =\n anchor;\n if (lineIndex != null && lineOffset != null) {\n const element = fileElement.shadowRoot?.querySelector(\n `[data-line][data-line-index=\"${lineIndex}\"]`\n );\n if (element instanceof HTMLElement) {\n const top = getRelativeBoundingTop(element, scrollContainer);\n if (top !== lineOffset) {\n const scrollOffset = top - lineOffset;\n this.applyScrollFix(scrollOffset);\n }\n return;\n }\n }\n const top = getRelativeBoundingTop(fileElement, scrollContainer);\n if (fileTypeOffset === 'top') {\n if (top !== fileOffset) {\n this.applyScrollFix(top - fileOffset);\n }\n } else {\n const bottom = top + fileElement.getBoundingClientRect().height;\n if (bottom !== fileOffset) {\n this.applyScrollFix(bottom - fileOffset);\n }\n }\n }\n\n private applyScrollFix(scrollOffset: number) {\n if (this.root == null || this.root instanceof Document) {\n window.scrollTo({\n top: window.scrollY + scrollOffset,\n behavior: 'instant',\n });\n } else {\n this.root.scrollTo({\n top: this.root.scrollTop + scrollOffset,\n behavior: 'instant',\n });\n }\n // Because we fixed our scroll positions, it means something resized or\n // moved around, so we should mark everything as dirty so the\n // reconciliation call will get the latest data when figuring calling\n // .getOffsetInScrollContainer\n this.markDOMDirty();\n }\n\n // This function tries to figure out the closest file or line to the viewport\n // top that's visible to use as a relative marker for how to fix scroll\n // position after issuing dom updates\n private getScrollAnchor(viewportHeight: number): ScrollAnchor | undefined {\n const scrollContainer = this.getScrollContainerElement();\n let bestAnchor: ScrollAnchor | undefined;\n\n for (const [fileElement] of this.visibleInstances.entries()) {\n const fileTop = getRelativeBoundingTop(fileElement, scrollContainer);\n const fileBottom = fileTop + fileElement.offsetHeight;\n\n // Determine file offset and type based on position\n // Only use bottom anchor when entire file is above viewport\n let fileOffset: number;\n let fileTypeOffset: 'top' | 'bottom';\n if (fileBottom <= 0) {\n // Entire file is above viewport - use bottom as anchor\n fileOffset = fileBottom;\n fileTypeOffset = 'bottom';\n } else {\n // File is at least partially visible or below - use top\n fileOffset = fileTop;\n fileTypeOffset = 'top';\n }\n\n // Find the best line (first fully visible) within this file\n let bestLineIndex: string | undefined;\n let bestLineOffset: number | undefined;\n\n // Only search for lines if file potentially intersects viewport\n if (fileBottom > 0 && fileTop < viewportHeight) {\n for (const line of fileElement.shadowRoot?.querySelectorAll(\n '[data-line][data-line-index]'\n ) ?? []) {\n if (!(line instanceof HTMLElement)) continue;\n const lineIndex = line.dataset.lineIndex;\n if (lineIndex == null) continue;\n\n const lineOffset = getRelativeBoundingTop(line, scrollContainer);\n\n // Ignore lines with negative offsets (above viewport top)\n if (lineOffset < 0) continue;\n\n // First visible line in DOM order is the best one because\n // querySelectorAll will grab lines in order as they appear in the\n // DOM\n bestLineIndex = lineIndex;\n bestLineOffset = lineOffset;\n break;\n }\n }\n\n // If we already have an anchor with a visible line, skip files without one\n if (bestAnchor?.lineOffset != null && bestLineOffset == null) {\n continue;\n }\n\n // Decide if this file should become the new best anchor\n let shouldReplace = false;\n // If we don't already have an anchor we should set one\n if (bestAnchor == null) {\n shouldReplace = true;\n }\n // If we found a better line anchor, we should replace the old one\n else if (\n bestLineOffset != null &&\n (bestAnchor.lineOffset == null ||\n bestLineOffset < bestAnchor.lineOffset)\n ) {\n shouldReplace = true;\n }\n // Otherwise we need to compare file only anchors\n else if (bestLineOffset == null && bestAnchor.lineOffset == null) {\n // Favor files with their tops in view\n if (\n fileOffset >= 0 &&\n (bestAnchor.fileOffset < 0 || fileOffset < bestAnchor.fileOffset)\n ) {\n shouldReplace = true;\n }\n // Or the closest file\n else if (\n fileOffset < 0 &&\n bestAnchor.fileOffset < 0 &&\n fileOffset > bestAnchor.fileOffset\n ) {\n shouldReplace = true;\n }\n }\n\n if (shouldReplace) {\n bestAnchor = {\n fileElement,\n fileTypeOffset,\n fileOffset,\n lineIndex: bestLineIndex,\n lineOffset: bestLineOffset,\n };\n }\n }\n\n return bestAnchor;\n }\n\n private handleIntersectionChange = (\n entries: IntersectionObserverEntry[]\n ): void => {\n this.scrollDirty = true;\n for (const { target, isIntersecting } of entries) {\n if (!(target instanceof HTMLElement)) {\n throw new Error(\n 'Virtualizer.handleIntersectionChange: target not an HTMLElement'\n );\n }\n const instance = this.observers.get(target);\n if (instance == null) {\n throw new Error(\n 'Virtualizer.handleIntersectionChange: no instance for target'\n );\n }\n if (isIntersecting && !this.visibleInstances.has(target)) {\n instance.setVisibility(true);\n this.visibleInstances.set(target, instance);\n this.visibleInstancesDirty = true;\n } else if (!isIntersecting && this.visibleInstances.has(target)) {\n instance.setVisibility(false);\n this.visibleInstances.delete(target);\n this.visibleInstancesDirty = true;\n }\n }\n\n if (this.visibleInstancesDirty) {\n // Since this call is already debounced, should we just call\n // computeRenderRangeAndEmit directly?\n queueRender(this.computeRenderRangeAndEmit);\n }\n // Debug logging for visible instances\n // console.log(\n // 'handleIntersectionChange',\n // ...Array.from(this.visibleInstances.keys())\n // );\n };\n\n private getScrollTop() {\n if (!this.scrollDirty) {\n return this.scrollTop;\n }\n this.scrollDirty = false;\n let scrollTop = (() => {\n if (this.root == null) {\n return 0;\n }\n if (this.root instanceof Document) {\n return window.scrollY;\n }\n return this.root.scrollTop;\n })();\n\n // Lets always make sure to clamp scroll position cases of\n // over/bounce scroll\n scrollTop = Math.max(\n 0,\n Math.min(scrollTop, this.getScrollHeight() - this.getHeight())\n );\n this.scrollTop = scrollTop;\n return scrollTop;\n }\n\n private getScrollHeight() {\n if (!this.scrollHeightDirty) {\n return this.scrollHeight;\n }\n this.scrollHeightDirty = false;\n this.scrollHeight = (() => {\n if (this.root == null) {\n return 0;\n }\n if (this.root instanceof Document) {\n return this.root.documentElement.scrollHeight;\n }\n return this.root.scrollHeight;\n })();\n return this.scrollHeight;\n }\n\n private getHeight() {\n if (!this.heightDirty) {\n return this.height;\n }\n this.heightDirty = false;\n this.height = (() => {\n if (this.root == null) {\n return 0;\n }\n if (this.root instanceof Document) {\n return globalThis.innerHeight;\n }\n return this.root.getBoundingClientRect().height;\n })();\n return this.height;\n }\n\n private markDOMDirty() {\n this.scrollDirty = true;\n this.scrollHeightDirty = true;\n this.heightDirty = true;\n }\n\n private getScrollContainerElement(): HTMLElement | undefined {\n return this.root == null || this.root instanceof Document\n ? undefined\n : this.root;\n }\n}\n\n// This function is like a generalized getBoundingClientRect for it's relative\n// scroll container\nfunction getRelativeBoundingTop(\n element: HTMLElement,\n scrollContainer: HTMLElement | undefined\n) {\n const rect = element.getBoundingClientRect();\n const scrollContainerTop = scrollContainer?.getBoundingClientRect().top ?? 0;\n return rect.top - scrollContainerTop;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Virtualizer.js","names":["DEFAULT_VIRTUALIZER_CONFIG: VirtualizerConfig","instance","top","bestAnchor: ScrollAnchor | undefined","fileOffset: number","fileTypeOffset: 'top' | 'bottom'","bestLineIndex: string | undefined","bestLineOffset: number | undefined"],"sources":["../../src/components/Virtualizer.ts"],"sourcesContent":["import { queueRender } from '../managers/UniversalRenderingManager';\nimport type { VirtualWindowSpecs } from '../types';\nimport { areVirtualWindowSpecsEqual } from '../utils/areVirtualWindowSpecsEqual';\nimport { createWindowFromScrollPosition } from '../utils/createWindowFromScrollPosition';\n\ninterface SubscribedInstance {\n onRender(dirty: boolean): boolean;\n reconcileHeights(): void;\n setVisibility(visible: boolean): void;\n}\n\ninterface ScrollAnchor {\n fileElement: HTMLElement;\n fileTypeOffset: 'top' | 'bottom';\n fileOffset: number;\n lineIndex: string | undefined;\n lineOffset: number | undefined;\n}\n\n// 800 seems like the healthy overscan required to\n// keep safari from blanking... if we catch it tho, maybe 900\nconst DEFAULT_OVERSCROLL_SIZE = 1000;\nconst INTERSECTION_OBSERVER_MARGIN = DEFAULT_OVERSCROLL_SIZE * 4;\nconst INTERSECTION_OBSERVER_THRESHOLD = [0, 0.000001, 0.99999, 1];\n\nexport interface VirtualizerConfig {\n overscrollSize: number;\n intersectionObserverMargin: number;\n resizeDebugging: boolean;\n}\n\nconst DEFAULT_VIRTUALIZER_CONFIG: VirtualizerConfig = {\n overscrollSize: DEFAULT_OVERSCROLL_SIZE,\n intersectionObserverMargin: INTERSECTION_OBSERVER_MARGIN,\n resizeDebugging: false,\n};\n\nlet lastSize = 0;\n\nlet instance = -1;\n\nexport class Virtualizer {\n static __STOP: boolean = false;\n static __lastScrollPosition = 0;\n\n public readonly __id: string = `virtualizer-${++instance}`;\n public readonly config: VirtualizerConfig;\n public type = 'basic';\n private intersectionObserver: IntersectionObserver | undefined;\n private scrollTop: number = 0;\n private height: number = 0;\n private scrollHeight: number = 0;\n private windowSpecs: VirtualWindowSpecs = { top: 0, bottom: 0 };\n private root: HTMLElement | Document | undefined;\n private contentContainer: HTMLElement | undefined;\n\n private resizeObserver: ResizeObserver | undefined;\n private observers: Map<HTMLElement, SubscribedInstance> = new Map();\n private visibleInstances: Map<HTMLElement, SubscribedInstance> = new Map();\n private visibleInstancesDirty: boolean = false;\n private instancesChanged: Set<SubscribedInstance> = new Set();\n\n private scrollDirty = true;\n private heightDirty = true;\n private scrollHeightDirty = true;\n private renderedObservers = 0;\n private connectQueue: Map<HTMLElement, SubscribedInstance> = new Map();\n\n constructor(config?: Partial<VirtualizerConfig>) {\n this.config = { ...DEFAULT_VIRTUALIZER_CONFIG, ...config };\n }\n\n setup(root: HTMLElement | Document, contentContainer?: Element): void {\n if (this.root != null) {\n return;\n }\n this.root = root;\n this.resizeObserver = new ResizeObserver(this.handleContainerResize);\n this.intersectionObserver = new IntersectionObserver(\n this.handleIntersectionChange,\n {\n root: this.root,\n threshold: INTERSECTION_OBSERVER_THRESHOLD,\n rootMargin: `${this.config.intersectionObserverMargin}px 0px ${this.config.intersectionObserverMargin}px 0px`,\n // FIXME(amadeus): Figure out the other settings we'll want in here, or\n // if we should make them configurable...\n }\n );\n if (root instanceof Document) {\n this.setupWindow();\n } else {\n this.setupElement(contentContainer);\n }\n\n // FIXME(amadeus): Remove me before release\n window.__INSTANCE = this;\n window.__TOGGLE = () => {\n if (Virtualizer.__STOP) {\n Virtualizer.__STOP = false;\n const scroller = this.getScrollContainerElement() ?? window;\n scroller.scrollTo({ top: Virtualizer.__lastScrollPosition });\n queueRender(this.computeRenderRangeAndEmit);\n } else {\n Virtualizer.__lastScrollPosition = this.getScrollTop();\n Virtualizer.__STOP = true;\n }\n };\n for (const [container, instance] of this.connectQueue.entries()) {\n this.connect(container, instance);\n }\n this.connectQueue.clear();\n this.markDOMDirty();\n queueRender(this.computeRenderRangeAndEmit);\n }\n\n instanceChanged(instance: SubscribedInstance): void {\n this.instancesChanged.add(instance);\n queueRender(this.computeRenderRangeAndEmit);\n }\n\n getWindowSpecs(): VirtualWindowSpecs {\n if (this.windowSpecs.top === 0 && this.windowSpecs.bottom === 0) {\n this.windowSpecs = createWindowFromScrollPosition({\n scrollTop: this.getScrollTop(),\n height: this.getHeight(),\n scrollHeight: this.getScrollHeight(),\n fitPerfectly: false,\n overscrollSize: this.config.overscrollSize,\n });\n }\n return this.windowSpecs;\n }\n\n isInstanceVisible(elementTop: number, elementHeight: number): boolean {\n const scrollTop = this.getScrollTop();\n const height = this.getHeight();\n const margin = this.config.intersectionObserverMargin;\n const top = scrollTop - margin;\n const bottom = scrollTop + height + margin;\n return !(elementTop < top - elementHeight || elementTop > bottom);\n }\n\n private handleContainerResize = (entries: ResizeObserverEntry[]) => {\n if (this.root == null) return;\n let shouldQueueUpdate = false;\n for (const entry of entries) {\n const blockSize = entry.borderBoxSize[0].blockSize;\n if (this.root instanceof Document) {\n if (blockSize !== this.scrollHeight) {\n this.scrollHeightDirty = true;\n shouldQueueUpdate = true;\n if (this.config.resizeDebugging) {\n console.log('Virtualizer: content size change', this.__id, {\n sizeChange: blockSize - lastSize,\n newSize: blockSize,\n });\n lastSize = blockSize;\n }\n }\n } else {\n if (entry.target === this.root) {\n if (blockSize !== this.height) {\n this.heightDirty = true;\n shouldQueueUpdate = true;\n }\n } else if (entry.target === this.contentContainer) {\n this.scrollHeightDirty = true;\n shouldQueueUpdate = true;\n if (this.config.resizeDebugging) {\n console.log('Virtualizer: scroller size change', this.__id, {\n sizeChange: blockSize - lastSize,\n newSize: blockSize,\n });\n lastSize = blockSize;\n }\n }\n }\n }\n\n if (shouldQueueUpdate) {\n queueRender(this.computeRenderRangeAndEmit);\n }\n };\n\n private setupWindow() {\n if (this.root == null || !(this.root instanceof Document)) {\n throw new Error('Virtualizer.setupWindow: Invalid setup method');\n }\n window.addEventListener('scroll', this.handleWindowScroll, {\n passive: true,\n });\n window.addEventListener('resize', this.handleWindowResize, {\n passive: true,\n });\n this.resizeObserver?.observe(this.root.documentElement);\n }\n\n private setupElement(contentContainer: Element | undefined) {\n if (this.root == null || this.root instanceof Document) {\n throw new Error('Virtualizer.setupElement: Invalid setup method');\n }\n this.root.addEventListener('scroll', this.handleElementScroll, {\n passive: true,\n });\n this.resizeObserver?.observe(this.root);\n contentContainer ??= this.root.firstElementChild ?? undefined;\n if (contentContainer instanceof HTMLElement) {\n this.contentContainer = contentContainer;\n this.resizeObserver?.observe(contentContainer);\n }\n }\n\n cleanUp(): void {\n this.resizeObserver?.disconnect();\n this.resizeObserver = undefined;\n this.intersectionObserver?.disconnect();\n this.intersectionObserver = undefined;\n this.root?.removeEventListener('scroll', this.handleElementScroll);\n window.removeEventListener('scroll', this.handleWindowScroll);\n window.removeEventListener('resize', this.handleWindowResize);\n this.root = undefined;\n this.contentContainer = undefined;\n this.observers.clear();\n this.visibleInstances.clear();\n this.instancesChanged.clear();\n this.connectQueue.clear();\n this.visibleInstancesDirty = false;\n this.windowSpecs = { top: 0, bottom: 0 };\n this.scrollTop = 0;\n this.height = 0;\n this.scrollHeight = 0;\n }\n\n getOffsetInScrollContainer(element: HTMLElement): number {\n return (\n this.getScrollTop() +\n getRelativeBoundingTop(element, this.getScrollContainerElement())\n );\n }\n\n connect(container: HTMLElement, instance: SubscribedInstance): () => void {\n if (this.observers.has(container)) {\n throw new Error('Virtualizer.connect: instance is already connected...');\n }\n // If we are racing against the intersectionObserver, then we should just\n // queue up the connection for when the observer does get set up\n if (this.intersectionObserver == null) {\n this.connectQueue.set(container, instance);\n } else {\n // FIXME(amadeus): Go through the connection phase a bit more closely...\n this.intersectionObserver.observe(container);\n this.observers.set(container, instance);\n this.instancesChanged.add(instance);\n this.markDOMDirty();\n queueRender(this.computeRenderRangeAndEmit);\n }\n return () => this.disconnect(container);\n }\n\n disconnect(container: HTMLElement): void {\n const instance = this.observers.get(container);\n this.connectQueue.delete(container);\n if (instance == null) {\n return;\n }\n this.intersectionObserver?.unobserve(container);\n this.observers.delete(container);\n if (this.visibleInstances.delete(container)) {\n this.visibleInstancesDirty = true;\n }\n this.markDOMDirty();\n queueRender(this.computeRenderRangeAndEmit);\n }\n\n private handleWindowResize = () => {\n if (Virtualizer.__STOP || window.innerHeight === this.height) {\n return;\n }\n this.heightDirty = true;\n queueRender(this.computeRenderRangeAndEmit);\n };\n\n private handleWindowScroll = () => {\n if (\n Virtualizer.__STOP ||\n this.root == null ||\n !(this.root instanceof Document)\n ) {\n return;\n }\n this.scrollDirty = true;\n queueRender(this.computeRenderRangeAndEmit);\n };\n\n private handleElementScroll = () => {\n if (\n Virtualizer.__STOP ||\n this.root == null ||\n this.root instanceof Document\n ) {\n return;\n }\n this.scrollDirty = true;\n queueRender(this.computeRenderRangeAndEmit);\n };\n\n private computeRenderRangeAndEmit = () => {\n if (Virtualizer.__STOP) {\n return;\n }\n const wrapperDirty = this.heightDirty || this.scrollHeightDirty;\n if (\n !this.scrollDirty &&\n !this.scrollHeightDirty &&\n !this.heightDirty &&\n this.renderedObservers === this.observers.size &&\n !this.visibleInstancesDirty &&\n this.instancesChanged.size === 0\n ) {\n // NOTE(amadeus): Is this a safe assumption/optimization?\n return;\n }\n\n // If we got an emitted update from a bunch of instances, we should skip\n // the window check first and attempt to render with existing logic first\n // and then queue up a corrected render after\n if (this.instancesChanged.size === 0) {\n const windowSpecs = createWindowFromScrollPosition({\n scrollTop: this.getScrollTop(),\n height: this.getHeight(),\n scrollHeight: this.getScrollHeight(),\n fitPerfectly: false,\n overscrollSize: this.config.overscrollSize,\n });\n if (\n areVirtualWindowSpecsEqual(this.windowSpecs, windowSpecs) &&\n this.renderedObservers === this.observers.size &&\n !this.visibleInstancesDirty &&\n this.instancesChanged.size === 0\n ) {\n return;\n }\n this.windowSpecs = windowSpecs;\n }\n this.visibleInstancesDirty = false;\n this.renderedObservers = this.observers.size;\n const anchor = this.getScrollAnchor(this.height);\n const updatedInstances = new Set<SubscribedInstance>();\n for (const instance of this.visibleInstances.values()) {\n if (instance.onRender(wrapperDirty)) {\n updatedInstances.add(instance);\n }\n }\n for (const instance of this.instancesChanged) {\n if (updatedInstances.has(instance)) continue;\n if (instance.onRender(wrapperDirty)) {\n updatedInstances.add(instance);\n }\n }\n\n this.scrollFix(anchor);\n // Scroll fix may have marked the dom as dirty, but if there instance\n // changes, we should definitely mark as dirty\n if (this.instancesChanged.size > 0) {\n this.markDOMDirty();\n }\n\n for (const instance of updatedInstances) {\n instance.reconcileHeights();\n }\n\n if (this.instancesChanged.size > 0 || wrapperDirty) {\n queueRender(this.computeRenderRangeAndEmit);\n }\n updatedInstances.clear();\n this.instancesChanged.clear();\n };\n\n private scrollFix(anchor: ScrollAnchor | undefined) {\n if (anchor == null) {\n return;\n }\n const scrollContainer = this.getScrollContainerElement();\n const { lineIndex, lineOffset, fileElement, fileOffset, fileTypeOffset } =\n anchor;\n if (lineIndex != null && lineOffset != null) {\n const element = fileElement.shadowRoot?.querySelector(\n `[data-line][data-line-index=\"${lineIndex}\"]`\n );\n if (element instanceof HTMLElement) {\n const top = getRelativeBoundingTop(element, scrollContainer);\n if (top !== lineOffset) {\n const scrollOffset = top - lineOffset;\n this.applyScrollFix(scrollOffset);\n }\n return;\n }\n }\n const top = getRelativeBoundingTop(fileElement, scrollContainer);\n if (fileTypeOffset === 'top') {\n if (top !== fileOffset) {\n this.applyScrollFix(top - fileOffset);\n }\n } else {\n const bottom = top + fileElement.getBoundingClientRect().height;\n if (bottom !== fileOffset) {\n this.applyScrollFix(bottom - fileOffset);\n }\n }\n }\n\n private applyScrollFix(scrollOffset: number) {\n if (this.root == null || this.root instanceof Document) {\n window.scrollTo({\n top: window.scrollY + scrollOffset,\n behavior: 'instant',\n });\n } else {\n this.root.scrollTo({\n top: this.root.scrollTop + scrollOffset,\n behavior: 'instant',\n });\n }\n // Because we fixed our scroll positions, it means something resized or\n // moved around, so we should mark everything as dirty so the\n // reconciliation call will get the latest data when figuring calling\n // .getOffsetInScrollContainer\n this.markDOMDirty();\n }\n\n // This function tries to figure out the closest file or line to the viewport\n // top that's visible to use as a relative marker for how to fix scroll\n // position after issuing dom updates\n private getScrollAnchor(viewportHeight: number): ScrollAnchor | undefined {\n const scrollContainer = this.getScrollContainerElement();\n let bestAnchor: ScrollAnchor | undefined;\n\n for (const [fileElement] of this.visibleInstances.entries()) {\n const fileTop = getRelativeBoundingTop(fileElement, scrollContainer);\n const fileBottom = fileTop + fileElement.offsetHeight;\n\n // Determine file offset and type based on position\n // Only use bottom anchor when entire file is above viewport\n let fileOffset: number;\n let fileTypeOffset: 'top' | 'bottom';\n if (fileBottom <= 0) {\n // Entire file is above viewport - use bottom as anchor\n fileOffset = fileBottom;\n fileTypeOffset = 'bottom';\n } else {\n // File is at least partially visible or below - use top\n fileOffset = fileTop;\n fileTypeOffset = 'top';\n }\n\n // Find the best line (first fully visible) within this file\n let bestLineIndex: string | undefined;\n let bestLineOffset: number | undefined;\n\n // Only search for lines if file potentially intersects viewport\n if (fileBottom > 0 && fileTop < viewportHeight) {\n for (const line of fileElement.shadowRoot?.querySelectorAll(\n '[data-line][data-line-index]'\n ) ?? []) {\n if (!(line instanceof HTMLElement)) continue;\n const lineIndex = line.dataset.lineIndex;\n if (lineIndex == null) continue;\n\n const lineOffset = getRelativeBoundingTop(line, scrollContainer);\n\n // Ignore lines with negative offsets (above viewport top)\n if (lineOffset < 0) continue;\n\n // First visible line in DOM order is the best one because\n // querySelectorAll will grab lines in order as they appear in the\n // DOM\n bestLineIndex = lineIndex;\n bestLineOffset = lineOffset;\n break;\n }\n }\n\n // If we already have an anchor with a visible line, skip files without one\n if (bestAnchor?.lineOffset != null && bestLineOffset == null) {\n continue;\n }\n\n // Decide if this file should become the new best anchor\n let shouldReplace = false;\n // If we don't already have an anchor we should set one\n if (bestAnchor == null) {\n shouldReplace = true;\n }\n // If we found a better line anchor, we should replace the old one\n else if (\n bestLineOffset != null &&\n (bestAnchor.lineOffset == null ||\n bestLineOffset < bestAnchor.lineOffset)\n ) {\n shouldReplace = true;\n }\n // Otherwise we need to compare file only anchors\n else if (bestLineOffset == null && bestAnchor.lineOffset == null) {\n // Favor files with their tops in view\n if (\n fileOffset >= 0 &&\n (bestAnchor.fileOffset < 0 || fileOffset < bestAnchor.fileOffset)\n ) {\n shouldReplace = true;\n }\n // Or the closest file\n else if (\n fileOffset < 0 &&\n bestAnchor.fileOffset < 0 &&\n fileOffset > bestAnchor.fileOffset\n ) {\n shouldReplace = true;\n }\n }\n\n if (shouldReplace) {\n bestAnchor = {\n fileElement,\n fileTypeOffset,\n fileOffset,\n lineIndex: bestLineIndex,\n lineOffset: bestLineOffset,\n };\n }\n }\n\n return bestAnchor;\n }\n\n private handleIntersectionChange = (\n entries: IntersectionObserverEntry[]\n ): void => {\n this.scrollDirty = true;\n for (const { target, isIntersecting } of entries) {\n if (!(target instanceof HTMLElement)) {\n throw new Error(\n 'Virtualizer.handleIntersectionChange: target not an HTMLElement'\n );\n }\n const instance = this.observers.get(target);\n if (instance == null) {\n throw new Error(\n 'Virtualizer.handleIntersectionChange: no instance for target'\n );\n }\n if (isIntersecting && !this.visibleInstances.has(target)) {\n instance.setVisibility(true);\n this.visibleInstances.set(target, instance);\n this.visibleInstancesDirty = true;\n } else if (!isIntersecting && this.visibleInstances.has(target)) {\n instance.setVisibility(false);\n this.visibleInstances.delete(target);\n this.visibleInstancesDirty = true;\n }\n }\n\n if (this.visibleInstancesDirty) {\n // Since this call is already debounced, should we just call\n // computeRenderRangeAndEmit directly?\n queueRender(this.computeRenderRangeAndEmit);\n }\n // Debug logging for visible instances\n // console.log(\n // 'handleIntersectionChange',\n // ...Array.from(this.visibleInstances.keys())\n // );\n };\n\n private getScrollTop() {\n if (!this.scrollDirty) {\n return this.scrollTop;\n }\n this.scrollDirty = false;\n let scrollTop = (() => {\n if (this.root == null) {\n return 0;\n }\n if (this.root instanceof Document) {\n return window.scrollY;\n }\n return this.root.scrollTop;\n })();\n\n // Lets always make sure to clamp scroll position cases of\n // over/bounce scroll\n scrollTop = Math.max(\n 0,\n Math.min(scrollTop, this.getScrollHeight() - this.getHeight())\n );\n this.scrollTop = scrollTop;\n return scrollTop;\n }\n\n private getScrollHeight() {\n if (!this.scrollHeightDirty) {\n return this.scrollHeight;\n }\n this.scrollHeightDirty = false;\n this.scrollHeight = (() => {\n if (this.root == null) {\n return 0;\n }\n if (this.root instanceof Document) {\n return this.root.documentElement.scrollHeight;\n }\n return this.root.scrollHeight;\n })();\n return this.scrollHeight;\n }\n\n private getHeight() {\n if (!this.heightDirty) {\n return this.height;\n }\n this.heightDirty = false;\n this.height = (() => {\n if (this.root == null) {\n return 0;\n }\n if (this.root instanceof Document) {\n return globalThis.innerHeight;\n }\n return this.root.getBoundingClientRect().height;\n })();\n return this.height;\n }\n\n private markDOMDirty() {\n this.scrollDirty = true;\n this.scrollHeightDirty = true;\n this.heightDirty = true;\n }\n\n private getScrollContainerElement(): HTMLElement | undefined {\n return this.root == null || this.root instanceof Document\n ? undefined\n : this.root;\n }\n}\n\n// This function is like a generalized getBoundingClientRect for it's relative\n// scroll container\nfunction getRelativeBoundingTop(\n element: HTMLElement,\n scrollContainer: HTMLElement | undefined\n) {\n const rect = element.getBoundingClientRect();\n const scrollContainerTop = scrollContainer?.getBoundingClientRect().top ?? 0;\n return rect.top - scrollContainerTop;\n}\n"],"mappings":"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"}
@@ -1,14 +1,16 @@
1
- import { DiffsHighlighter, DiffsThemeNames, SupportedLanguages } from "../types.js";
1
+ import { DiffsHighlighter, DiffsThemeNames, HighlighterTypes, SupportedLanguages } from "../types.js";
2
2
 
3
3
  //#region src/highlighter/shared_highlighter.d.ts
4
4
  type CachedOrLoadingHighlighterType = Promise<DiffsHighlighter> | DiffsHighlighter | undefined;
5
5
  interface HighlighterOptions {
6
6
  themes: DiffsThemeNames[];
7
7
  langs: SupportedLanguages[];
8
+ preferredHighlighter?: HighlighterTypes;
8
9
  }
9
10
  declare function getSharedHighlighter({
10
11
  themes,
11
- langs
12
+ langs,
13
+ preferredHighlighter
12
14
  }: HighlighterOptions): Promise<DiffsHighlighter>;
13
15
  declare function isHighlighterLoaded(h?: CachedOrLoadingHighlighterType): h is DiffsHighlighter;
14
16
  declare function getHighlighterIfLoaded(): DiffsHighlighter | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"shared_highlighter.d.ts","names":["DiffsHighlighter","DiffsThemeNames","SupportedLanguages","CachedOrLoadingHighlighterType","Promise","HighlighterOptions","getSharedHighlighter","themes","langs","isHighlighterLoaded","getHighlighterIfLoaded","isHighlighterLoading","isHighlighterNull","preloadHighlighter","disposeHighlighter"],"sources":["../../src/highlighter/shared_highlighter.d.ts"],"sourcesContent":["import type { DiffsHighlighter, DiffsThemeNames, SupportedLanguages } from '../types';\ntype CachedOrLoadingHighlighterType = Promise<DiffsHighlighter> | DiffsHighlighter | undefined;\ninterface HighlighterOptions {\n themes: DiffsThemeNames[];\n langs: SupportedLanguages[];\n}\nexport declare function getSharedHighlighter({ themes, langs }: HighlighterOptions): Promise<DiffsHighlighter>;\nexport declare function isHighlighterLoaded(h?: CachedOrLoadingHighlighterType): h is DiffsHighlighter;\nexport declare function getHighlighterIfLoaded(): DiffsHighlighter | undefined;\nexport declare function isHighlighterLoading(h?: CachedOrLoadingHighlighterType): h is Promise<DiffsHighlighter>;\nexport declare function isHighlighterNull(h?: CachedOrLoadingHighlighterType): h is undefined;\nexport declare function preloadHighlighter(options: HighlighterOptions): Promise<void>;\nexport declare function disposeHighlighter(): Promise<void>;\nexport {};\n//# sourceMappingURL=shared_highlighter.d.ts.map"],"mappings":";;;KACKG,8BAAAA,GAAiCC,QAAQJ,oBAAoBA;UACxDK,kBAAAA;EADLF,MAAAA,EAEOF,eAFPE,EAAAA;EAAyCH,KAAAA,EAGnCE,kBAHmCF,EAAAA;;AAAoBA,iBAK1CM,oBAAAA,CAL0CN;EAAAA,MAAAA;EAAAA;AAAAA,CAAAA,EAKFK,kBALEL,CAAAA,EAKmBI,OALnBJ,CAK2BA,gBAL3BA,CAAAA;AAAgB,iBAM1DS,mBAAAA,CAN0D,CAAA,CAAA,EAMlCN,8BANkC,CAAA,EAAA,CAAA,IAMIH,gBANJ;AACxEK,iBAMcK,sBAAAA,CAAAA,CALZT,EAKsCD,gBAJvCE,GAAAA,SAAkB;AAELI,iBAGAK,oBAAAA,CAHoB,CAAA,CAAA,EAGKR,8BAHL,CAAA,EAAA,CAAA,IAG2CC,OAH3C,CAGmDJ,gBAHnD,CAAA;AAAGO,iBAIvBK,iBAAAA,CAJuBL,CAAAA,CAAAA,EAIDJ,8BAJCI,CAAAA,EAAAA,CAAAA,IAAAA,SAAAA;AAAQC,iBAK/BK,kBAAAA,CAL+BL,OAAAA,EAKHH,kBALGG,CAAAA,EAKkBJ,OALlBI,CAAAA,IAAAA,CAAAA;AAASH,iBAMxCS,kBAAAA,CAAAA,CANwCT,EAMlBD,OANkBC,CAAAA,IAAAA,CAAAA"}
1
+ {"version":3,"file":"shared_highlighter.d.ts","names":["DiffsHighlighter","DiffsThemeNames","HighlighterTypes","SupportedLanguages","CachedOrLoadingHighlighterType","Promise","HighlighterOptions","getSharedHighlighter","themes","langs","preferredHighlighter","isHighlighterLoaded","getHighlighterIfLoaded","isHighlighterLoading","isHighlighterNull","preloadHighlighter","disposeHighlighter"],"sources":["../../src/highlighter/shared_highlighter.d.ts"],"sourcesContent":["import type { DiffsHighlighter, DiffsThemeNames, HighlighterTypes, SupportedLanguages } from '../types';\ntype CachedOrLoadingHighlighterType = Promise<DiffsHighlighter> | DiffsHighlighter | undefined;\ninterface HighlighterOptions {\n themes: DiffsThemeNames[];\n langs: SupportedLanguages[];\n preferredHighlighter?: HighlighterTypes;\n}\nexport declare function getSharedHighlighter({ themes, langs, preferredHighlighter }: HighlighterOptions): Promise<DiffsHighlighter>;\nexport declare function isHighlighterLoaded(h?: CachedOrLoadingHighlighterType): h is DiffsHighlighter;\nexport declare function getHighlighterIfLoaded(): DiffsHighlighter | undefined;\nexport declare function isHighlighterLoading(h?: CachedOrLoadingHighlighterType): h is Promise<DiffsHighlighter>;\nexport declare function isHighlighterNull(h?: CachedOrLoadingHighlighterType): h is undefined;\nexport declare function preloadHighlighter(options: HighlighterOptions): Promise<void>;\nexport declare function disposeHighlighter(): Promise<void>;\nexport {};\n//# sourceMappingURL=shared_highlighter.d.ts.map"],"mappings":";;;KACKI,8BAAAA,GAAiCC,QAAQL,oBAAoBA;UACxDM,kBAAAA;EADLF,MAAAA,EAEOH,eAFPG,EAAAA;EAAyCJ,KAAAA,EAGnCG,kBAHmCH,EAAAA;EAARK,oBAAAA,CAAAA,EAIXH,gBAJWG;;AAA4C,iBAM1DE,oBAAAA,CAN0D;EAAA,MAAA;EAAA,KAAA;EAAA;AAAA,CAAA,EAMID,kBANJ,CAAA,EAMyBD,OANzB,CAMiCL,gBANjC,CAAA;AACxEM,iBAMcK,mBAAAA,CANI,CAAA,CAAA,EAMoBP,8BANpB,CAAA,EAAA,CAAA,IAM0DJ,gBAN1D;AAChBC,iBAMYW,sBAAAA,CAAAA,CANZX,EAMsCD,gBANtCC,GAAAA,SAAAA;AACDE,iBAMaU,oBAAAA,CANbV,CAAAA,CAAAA,EAMsCC,8BANtCD,CAAAA,EAAAA,CAAAA,IAM4EE,OAN5EF,CAMoFH,gBANpFG,CAAAA;AACgBD,iBAMHY,iBAAAA,CANGZ,CAAAA,CAAAA,EAMmBE,8BANnBF,CAAAA,EAAAA,CAAAA,IAAAA,SAAAA;AAAgB,iBAOnBa,kBAAAA,CAPmB,OAAA,EAOST,kBAPT,CAAA,EAO8BD,OAP9B,CAAA,IAAA,CAAA;AAEnBE,iBAMAS,kBAAAA,CAAAA,CANoB,EAMEX,OANF,CAAA,IAAA,CAAA"}
@@ -5,15 +5,15 @@ import { attachResolvedThemes } from "./themes/attachResolvedThemes.js";
5
5
  import { cleanUpResolvedThemes } from "./themes/cleanUpResolvedThemes.js";
6
6
  import { getResolvedOrResolveTheme } from "./themes/getResolvedOrResolveTheme.js";
7
7
  import { registerCustomTheme } from "./themes/registerCustomTheme.js";
8
- import { createHighlighter, createJavaScriptRegexEngine } from "shiki";
8
+ import { createHighlighter, createJavaScriptRegexEngine, createOnigurumaEngine } from "shiki";
9
9
 
10
10
  //#region src/highlighter/shared_highlighter.ts
11
11
  let highlighter;
12
- async function getSharedHighlighter({ themes, langs }) {
12
+ async function getSharedHighlighter({ themes, langs, preferredHighlighter = "shiki-js" }) {
13
13
  highlighter ??= createHighlighter({
14
14
  themes: [],
15
15
  langs: ["text"],
16
- engine: createJavaScriptRegexEngine()
16
+ engine: preferredHighlighter === "shiki-wasm" ? createOnigurumaEngine(import("shiki/wasm")) : createJavaScriptRegexEngine()
17
17
  });
18
18
  const instance = isHighlighterLoading(highlighter) ? await highlighter : highlighter;
19
19
  highlighter = instance;
@@ -1 +1 @@
1
- {"version":3,"file":"shared_highlighter.js","names":["highlighter: CachedOrLoadingHighlighterType","languageLoaders: Promise<ResolvedLanguage>[]","themeLoaders: Promise<ThemeRegistrationResolved>[]","themes"],"sources":["../../src/highlighter/shared_highlighter.ts"],"sourcesContent":["import { createHighlighter, createJavaScriptRegexEngine } from 'shiki';\n\nimport type {\n DiffsHighlighter,\n DiffsThemeNames,\n SupportedLanguages,\n ThemeRegistrationResolved,\n} from '../types';\nimport type { ResolvedLanguage } from '../worker/types';\nimport { attachResolvedLanguages } from './languages/attachResolvedLanguages';\nimport { cleanUpResolvedLanguages } from './languages/cleanUpResolvedLanguages';\nimport { getResolvedOrResolveLanguage } from './languages/getResolvedOrResolveLanguage';\nimport { attachResolvedThemes } from './themes/attachResolvedThemes';\nimport { cleanUpResolvedThemes } from './themes/cleanUpResolvedThemes';\nimport { getResolvedOrResolveTheme } from './themes/getResolvedOrResolveTheme';\nimport { registerCustomTheme } from './themes/registerCustomTheme';\n\ntype CachedOrLoadingHighlighterType =\n | Promise<DiffsHighlighter>\n | DiffsHighlighter\n | undefined;\n\nlet highlighter: CachedOrLoadingHighlighterType;\n\ninterface HighlighterOptions {\n themes: DiffsThemeNames[];\n langs: SupportedLanguages[];\n}\n\nexport async function getSharedHighlighter({\n themes,\n langs,\n}: HighlighterOptions): Promise<DiffsHighlighter> {\n highlighter ??= createHighlighter({\n themes: [],\n langs: ['text'],\n engine: createJavaScriptRegexEngine(),\n }) as Promise<DiffsHighlighter>;\n\n const instance = isHighlighterLoading(highlighter)\n ? await highlighter\n : highlighter;\n highlighter = instance;\n\n const languageLoaders: Promise<ResolvedLanguage>[] = [];\n for (const language of langs) {\n if (language === 'text' || language === 'ansi') continue;\n const maybeResolvedLanguage = getResolvedOrResolveLanguage(language);\n if ('then' in maybeResolvedLanguage) {\n languageLoaders.push(maybeResolvedLanguage);\n } else {\n attachResolvedLanguages(maybeResolvedLanguage, instance);\n }\n }\n\n const themeLoaders: Promise<ThemeRegistrationResolved>[] = [];\n for (const themeName of themes) {\n const maybeResolvedTheme = getResolvedOrResolveTheme(themeName);\n if ('then' in maybeResolvedTheme) {\n themeLoaders.push(maybeResolvedTheme);\n } else {\n attachResolvedThemes(maybeResolvedTheme, highlighter);\n }\n }\n\n // If we need to load any languages or themes, lets do that now\n if (languageLoaders.length > 0 || themeLoaders.length > 0) {\n await Promise.all([\n Promise.all(languageLoaders).then((languages) => {\n attachResolvedLanguages(languages, instance);\n }),\n Promise.all(themeLoaders).then((themes) => {\n attachResolvedThemes(themes, instance);\n }),\n ]);\n }\n\n return instance;\n}\n\nexport function isHighlighterLoaded(\n h: CachedOrLoadingHighlighterType = highlighter\n): h is DiffsHighlighter {\n return h != null && !('then' in h);\n}\n\nexport function getHighlighterIfLoaded(): DiffsHighlighter | undefined {\n if (highlighter != null && !('then' in highlighter)) {\n return highlighter;\n }\n return undefined;\n}\n\nexport function isHighlighterLoading(\n h: CachedOrLoadingHighlighterType = highlighter\n): h is Promise<DiffsHighlighter> {\n return h != null && 'then' in h;\n}\n\nexport function isHighlighterNull(\n h: CachedOrLoadingHighlighterType = highlighter\n): h is undefined {\n return h == null;\n}\n\nexport async function preloadHighlighter(\n options: HighlighterOptions\n): Promise<void> {\n return void (await getSharedHighlighter(options));\n}\n\nexport async function disposeHighlighter(): Promise<void> {\n if (highlighter == null) return;\n (await highlighter).dispose();\n cleanUpResolvedLanguages();\n cleanUpResolvedThemes();\n highlighter = undefined;\n}\n\nregisterCustomTheme('pierre-dark', () => {\n return import('../themes/pierre-dark.json') as unknown as Promise<ThemeRegistrationResolved>;\n});\n\nregisterCustomTheme('pierre-light', () => {\n return import('../themes/pierre-light.json') as unknown as Promise<ThemeRegistrationResolved>;\n});\n"],"mappings":";;;;;;;;;;AAsBA,IAAIA;AAOJ,eAAsB,qBAAqB,EACzC,QACA,SACgD;AAChD,iBAAgB,kBAAkB;EAChC,QAAQ,EAAE;EACV,OAAO,CAAC,OAAO;EACf,QAAQ,6BAA6B;EACtC,CAAC;CAEF,MAAM,WAAW,qBAAqB,YAAY,GAC9C,MAAM,cACN;AACJ,eAAc;CAEd,MAAMC,kBAA+C,EAAE;AACvD,MAAK,MAAM,YAAY,OAAO;AAC5B,MAAI,aAAa,UAAU,aAAa,OAAQ;EAChD,MAAM,wBAAwB,6BAA6B,SAAS;AACpE,MAAI,UAAU,sBACZ,iBAAgB,KAAK,sBAAsB;MAE3C,yBAAwB,uBAAuB,SAAS;;CAI5D,MAAMC,eAAqD,EAAE;AAC7D,MAAK,MAAM,aAAa,QAAQ;EAC9B,MAAM,qBAAqB,0BAA0B,UAAU;AAC/D,MAAI,UAAU,mBACZ,cAAa,KAAK,mBAAmB;MAErC,sBAAqB,oBAAoB,YAAY;;AAKzD,KAAI,gBAAgB,SAAS,KAAK,aAAa,SAAS,EACtD,OAAM,QAAQ,IAAI,CAChB,QAAQ,IAAI,gBAAgB,CAAC,MAAM,cAAc;AAC/C,0BAAwB,WAAW,SAAS;GAC5C,EACF,QAAQ,IAAI,aAAa,CAAC,MAAM,aAAW;AACzC,uBAAqBC,UAAQ,SAAS;GACtC,CACH,CAAC;AAGJ,QAAO;;AAGT,SAAgB,oBACd,IAAoC,aACb;AACvB,QAAO,KAAK,QAAQ,EAAE,UAAU;;AAGlC,SAAgB,yBAAuD;AACrE,KAAI,eAAe,QAAQ,EAAE,UAAU,aACrC,QAAO;;AAKX,SAAgB,qBACd,IAAoC,aACJ;AAChC,QAAO,KAAK,QAAQ,UAAU;;AAGhC,SAAgB,kBACd,IAAoC,aACpB;AAChB,QAAO,KAAK;;AAGd,eAAsB,mBACpB,SACe;AACR,CAAM,MAAM,qBAAqB,QAAQ;;AAGlD,eAAsB,qBAAoC;AACxD,KAAI,eAAe,KAAM;AACzB,EAAC,MAAM,aAAa,SAAS;AAC7B,2BAA0B;AAC1B,wBAAuB;AACvB,eAAc;;AAGhB,oBAAoB,qBAAqB;AACvC,QAAO,OAAO;EACd;AAEF,oBAAoB,sBAAsB;AACxC,QAAO,OAAO;EACd"}
1
+ {"version":3,"file":"shared_highlighter.js","names":["highlighter: CachedOrLoadingHighlighterType","languageLoaders: Promise<ResolvedLanguage>[]","themeLoaders: Promise<ThemeRegistrationResolved>[]","themes"],"sources":["../../src/highlighter/shared_highlighter.ts"],"sourcesContent":["import {\n createHighlighter,\n createJavaScriptRegexEngine,\n createOnigurumaEngine,\n} from 'shiki';\n\nimport type {\n DiffsHighlighter,\n DiffsThemeNames,\n HighlighterTypes,\n SupportedLanguages,\n ThemeRegistrationResolved,\n} from '../types';\nimport type { ResolvedLanguage } from '../worker/types';\nimport { attachResolvedLanguages } from './languages/attachResolvedLanguages';\nimport { cleanUpResolvedLanguages } from './languages/cleanUpResolvedLanguages';\nimport { getResolvedOrResolveLanguage } from './languages/getResolvedOrResolveLanguage';\nimport { attachResolvedThemes } from './themes/attachResolvedThemes';\nimport { cleanUpResolvedThemes } from './themes/cleanUpResolvedThemes';\nimport { getResolvedOrResolveTheme } from './themes/getResolvedOrResolveTheme';\nimport { registerCustomTheme } from './themes/registerCustomTheme';\n\ntype CachedOrLoadingHighlighterType =\n | Promise<DiffsHighlighter>\n | DiffsHighlighter\n | undefined;\n\nlet highlighter: CachedOrLoadingHighlighterType;\n\ninterface HighlighterOptions {\n themes: DiffsThemeNames[];\n langs: SupportedLanguages[];\n preferredHighlighter?: HighlighterTypes;\n}\n\nexport async function getSharedHighlighter({\n themes,\n langs,\n preferredHighlighter = 'shiki-js',\n}: HighlighterOptions): Promise<DiffsHighlighter> {\n highlighter ??= createHighlighter({\n themes: [],\n langs: ['text'],\n engine:\n preferredHighlighter === 'shiki-wasm'\n ? createOnigurumaEngine(import('shiki/wasm'))\n : createJavaScriptRegexEngine(),\n }) as Promise<DiffsHighlighter>;\n\n const instance = isHighlighterLoading(highlighter)\n ? await highlighter\n : highlighter;\n highlighter = instance;\n\n const languageLoaders: Promise<ResolvedLanguage>[] = [];\n for (const language of langs) {\n if (language === 'text' || language === 'ansi') continue;\n const maybeResolvedLanguage = getResolvedOrResolveLanguage(language);\n if ('then' in maybeResolvedLanguage) {\n languageLoaders.push(maybeResolvedLanguage);\n } else {\n attachResolvedLanguages(maybeResolvedLanguage, instance);\n }\n }\n\n const themeLoaders: Promise<ThemeRegistrationResolved>[] = [];\n for (const themeName of themes) {\n const maybeResolvedTheme = getResolvedOrResolveTheme(themeName);\n if ('then' in maybeResolvedTheme) {\n themeLoaders.push(maybeResolvedTheme);\n } else {\n attachResolvedThemes(maybeResolvedTheme, highlighter);\n }\n }\n\n // If we need to load any languages or themes, lets do that now\n if (languageLoaders.length > 0 || themeLoaders.length > 0) {\n await Promise.all([\n Promise.all(languageLoaders).then((languages) => {\n attachResolvedLanguages(languages, instance);\n }),\n Promise.all(themeLoaders).then((themes) => {\n attachResolvedThemes(themes, instance);\n }),\n ]);\n }\n\n return instance;\n}\n\nexport function isHighlighterLoaded(\n h: CachedOrLoadingHighlighterType = highlighter\n): h is DiffsHighlighter {\n return h != null && !('then' in h);\n}\n\nexport function getHighlighterIfLoaded(): DiffsHighlighter | undefined {\n if (highlighter != null && !('then' in highlighter)) {\n return highlighter;\n }\n return undefined;\n}\n\nexport function isHighlighterLoading(\n h: CachedOrLoadingHighlighterType = highlighter\n): h is Promise<DiffsHighlighter> {\n return h != null && 'then' in h;\n}\n\nexport function isHighlighterNull(\n h: CachedOrLoadingHighlighterType = highlighter\n): h is undefined {\n return h == null;\n}\n\nexport async function preloadHighlighter(\n options: HighlighterOptions\n): Promise<void> {\n return void (await getSharedHighlighter(options));\n}\n\nexport async function disposeHighlighter(): Promise<void> {\n if (highlighter == null) return;\n (await highlighter).dispose();\n cleanUpResolvedLanguages();\n cleanUpResolvedThemes();\n highlighter = undefined;\n}\n\nregisterCustomTheme('pierre-dark', () => {\n return import('../themes/pierre-dark.json') as unknown as Promise<ThemeRegistrationResolved>;\n});\n\nregisterCustomTheme('pierre-light', () => {\n return import('../themes/pierre-light.json') as unknown as Promise<ThemeRegistrationResolved>;\n});\n"],"mappings":";;;;;;;;;;AA2BA,IAAIA;AAQJ,eAAsB,qBAAqB,EACzC,QACA,OACA,uBAAuB,cACyB;AAChD,iBAAgB,kBAAkB;EAChC,QAAQ,EAAE;EACV,OAAO,CAAC,OAAO;EACf,QACE,yBAAyB,eACrB,sBAAsB,OAAO,cAAc,GAC3C,6BAA6B;EACpC,CAAC;CAEF,MAAM,WAAW,qBAAqB,YAAY,GAC9C,MAAM,cACN;AACJ,eAAc;CAEd,MAAMC,kBAA+C,EAAE;AACvD,MAAK,MAAM,YAAY,OAAO;AAC5B,MAAI,aAAa,UAAU,aAAa,OAAQ;EAChD,MAAM,wBAAwB,6BAA6B,SAAS;AACpE,MAAI,UAAU,sBACZ,iBAAgB,KAAK,sBAAsB;MAE3C,yBAAwB,uBAAuB,SAAS;;CAI5D,MAAMC,eAAqD,EAAE;AAC7D,MAAK,MAAM,aAAa,QAAQ;EAC9B,MAAM,qBAAqB,0BAA0B,UAAU;AAC/D,MAAI,UAAU,mBACZ,cAAa,KAAK,mBAAmB;MAErC,sBAAqB,oBAAoB,YAAY;;AAKzD,KAAI,gBAAgB,SAAS,KAAK,aAAa,SAAS,EACtD,OAAM,QAAQ,IAAI,CAChB,QAAQ,IAAI,gBAAgB,CAAC,MAAM,cAAc;AAC/C,0BAAwB,WAAW,SAAS;GAC5C,EACF,QAAQ,IAAI,aAAa,CAAC,MAAM,aAAW;AACzC,uBAAqBC,UAAQ,SAAS;GACtC,CACH,CAAC;AAGJ,QAAO;;AAGT,SAAgB,oBACd,IAAoC,aACb;AACvB,QAAO,KAAK,QAAQ,EAAE,UAAU;;AAGlC,SAAgB,yBAAuD;AACrE,KAAI,eAAe,QAAQ,EAAE,UAAU,aACrC,QAAO;;AAKX,SAAgB,qBACd,IAAoC,aACJ;AAChC,QAAO,KAAK,QAAQ,UAAU;;AAGhC,SAAgB,kBACd,IAAoC,aACpB;AAChB,QAAO,KAAK;;AAGd,eAAsB,mBACpB,SACe;AACR,CAAM,MAAM,qBAAqB,QAAQ;;AAGlD,eAAsB,qBAAoC;AACxD,KAAI,eAAe,KAAM;AACzB,EAAC,MAAM,aAAa,SAAS;AAC7B,2BAA0B;AAC1B,wBAAuB;AACvB,eAAc;;AAGhB,oBAAoB,qBAAqB;AACvC,QAAO,OAAO;EACd;AAEF,oBAAoB,sBAAsB;AACxC,QAAO,OAAO;EACd"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent, ChangeTypes, CodeColumnType, CodeToHastOptions, ContextContent, DecorationItem, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, FileContents, FileDiffMetadata, ForceDiffPlainTextOptions, ForceFilePlainTextOptions, GapSpan, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PrePropertiesConfig, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SelectionSide, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, VirtualFileMetrics, VirtualWindowSpecs } from "./types.js";
1
+ import { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent, ChangeTypes, CodeColumnType, CodeToHastOptions, ContextContent, DecorationItem, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, FileContents, FileDiffMetadata, ForceDiffPlainTextOptions, ForceFilePlainTextOptions, GapSpan, HighlighterTypes, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PrePropertiesConfig, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SelectionSide, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, VirtualFileMetrics, VirtualWindowSpecs } from "./types.js";
2
2
  import { GetLineIndexUtility, LineSelectionManager, LineSelectionOptions, SelectedLineRange, pluckLineSelectionOptions } from "./managers/LineSelectionManager.js";
3
3
  import { GetHoveredLineResult, LogTypes, MouseEventManager, MouseEventManagerBaseOptions, MouseEventManagerMode, MouseEventManagerOptions, OnDiffLineClickProps, OnDiffLineEnterLeaveProps, OnLineClickProps, OnLineEnterLeaveProps, pluckMouseEventOptions } from "./managers/MouseEventManager.js";
4
4
  import { ResizeManager } from "./managers/ResizeManager.js";
@@ -96,4 +96,4 @@ import { setPreNodeProperties } from "./utils/setWrapperNodeProps.js";
96
96
  import { trimPatchContext } from "./utils/trimPatchContext.js";
97
97
  import { FileDiff, FileDiffHydrationProps, FileDiffOptions, FileDiffRenderProps } from "./components/FileDiff.js";
98
98
  import { codeToHtml, createCssVariablesTheme as createCSSVariablesTheme } from "shiki";
99
- export { ALTERNATE_FILE_NAMES_GIT, AnnotationLineMap, AnnotationSide, AnnotationSpan, AttachedLanguages, AttachedThemes, BaseCodeOptions, BaseDiffOptions, BundledLanguage, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, CUSTOM_EXTENSION_TO_FILE_FORMAT, ChangeContent, ChangeTypes, CodeColumnType, CodeToHastOptions, CodeToTokenTransformStream, CodeToTokenTransformStreamOptions, ContextContent, CreateFileHeaderElementProps, DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, DEFAULT_EXPANDED_REGION, DEFAULT_RENDER_RANGE, DEFAULT_THEMES, DEFAULT_VIRTUAL_FILE_METRICS, DIFFS_TAG_NAME, DecorationItem, DiffHunksRenderer, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, EXTENSION_TO_FILE_FORMAT, ExpansionDirections, ExtensionFormatMap, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, File, FileContents, FileDiff, FileDiffHydrationProps, FileDiffMetadata, FileDiffOptions, FileDiffRenderProps, FileHyrdateProps, FileOptions, FileRenderProps, FileRenderResult, FileRenderer, FileRendererOptions, FileStream, FileStreamOptions, ForceDiffPlainTextOptions, ForceFilePlainTextOptions, GIT_DIFF_FILE_BREAK_REGEX, GapSpan, GetHoveredLineResult, GetLineIndexUtility, HEADER_METADATA_SLOT_ID, HUNK_HEADER, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, HunksRenderResult, INDEX_LINE_METADATA, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSelectionManager, LineSelectionOptions, LineSpans, LineTypes, LogTypes, MouseEventManager, MouseEventManagerBaseOptions, MouseEventManagerMode, MouseEventManagerOptions, ObservedAnnotationNodes, ObservedGridNodes, OnDiffLineClickProps, OnDiffLineEnterLeaveProps, OnLineClickProps, OnLineEnterLeaveProps, ParsedLine, ParsedPatch, PrePropertiesConfig, RecallToken, RegisteredCustomLanguages, RegisteredCustomThemes, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, ResizeManager, ResolvedLanguages, ResolvedThemes, ResolvingLanguages, ResolvingThemes, SPLIT_WITH_NEWLINES, SVGSpriteNames, SVGSpriteSheet, ScrollSyncManager, SelectedLineRange, SelectionSide, SharedRenderState, ShikiStreamTokenizer, ShikiStreamTokenizerEnqueueResult, ShikiStreamTokenizerOptions, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE, VirtualFileMetrics, VirtualWindowSpecs, VirtualizedFile, VirtualizedFileDiff, Virtualizer, VirtualizerConfig, areDiffLineAnnotationsEqual, areFilesEqual, areHunkDataEqual, areLanguagesAttached, areLineAnnotationsEqual, areObjectsEqual, areOptionsEqual, arePrePropertiesEqual, areRenderRangesEqual, areSelectionsEqual, areThemesAttached, areThemesEqual, areVirtualWindowSpecsEqual, areWorkerStatsEqual, attachResolvedLanguages, attachResolvedThemes, cleanLastNewline, cleanUpResolvedLanguages, cleanUpResolvedThemes, codeToHtml, createAnnotationElement, createAnnotationWrapperNode, createCSSVariablesTheme, createDiffSpanDecoration, createEmptyRowBuffer, createFileHeaderElement, createGutterGap, createGutterItem, createGutterWrapper, createHastElement, createHoverContentNode, createIconElement, createNoNewlineElement, createPreElement, createPreWrapperProperties, createRowNodes, createSeparator, createSpanFromToken, createStyleElement, createTextNodeElement, createTransformerWithState, createUnsafeCSSStyleNode, createWindowFromScrollPosition, diffAcceptRejectHunk, disposeHighlighter, extendFileFormatMap, findCodeElement, formatCSSVariablePrefix, getFiletypeFromFileName, getHighlighterIfLoaded, getHighlighterOptions, getHighlighterThemeStyles, getHunkSeparatorSlotName, getIconForType, getLineAnnotationName, getLineEndingType, getLineNodes, getOrCreateCodeNode, getResolvedLanguages, getResolvedOrResolveLanguage, getResolvedOrResolveTheme, getResolvedThemes, getSharedHighlighter, getSingularPatch, getThemes, getTotalLineCountFromHunks, hasResolvedLanguages, hasResolvedThemes, isDefaultRenderRange, isHighlighterLoaded, isHighlighterLoading, isHighlighterNull, isWorkerContext, parseDiffFromFile, parseLineType, parsePatchFiles, pluckLineSelectionOptions, pluckMouseEventOptions, preloadHighlighter, prerenderHTMLIfNecessary, processFile, processLine, processPatch, pushOrJoinSpan, queueRender, registerCustomCSSVariableTheme, registerCustomLanguage, registerCustomTheme, renderDiffWithHighlighter, renderFileWithHighlighter, resolveLanguage, resolveLanguages, resolveTheme, resolveThemes, setLanguageOverride, setPreNodeProperties, trimPatchContext, wrapCoreCSS, wrapUnsafeCSS };
99
+ export { ALTERNATE_FILE_NAMES_GIT, AnnotationLineMap, AnnotationSide, AnnotationSpan, AttachedLanguages, AttachedThemes, BaseCodeOptions, BaseDiffOptions, BundledLanguage, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, CUSTOM_EXTENSION_TO_FILE_FORMAT, ChangeContent, ChangeTypes, CodeColumnType, CodeToHastOptions, CodeToTokenTransformStream, CodeToTokenTransformStreamOptions, ContextContent, CreateFileHeaderElementProps, DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, DEFAULT_EXPANDED_REGION, DEFAULT_RENDER_RANGE, DEFAULT_THEMES, DEFAULT_VIRTUAL_FILE_METRICS, DIFFS_TAG_NAME, DecorationItem, DiffHunksRenderer, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, EXTENSION_TO_FILE_FORMAT, ExpansionDirections, ExtensionFormatMap, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, File, FileContents, FileDiff, FileDiffHydrationProps, FileDiffMetadata, FileDiffOptions, FileDiffRenderProps, FileHyrdateProps, FileOptions, FileRenderProps, FileRenderResult, FileRenderer, FileRendererOptions, FileStream, FileStreamOptions, ForceDiffPlainTextOptions, ForceFilePlainTextOptions, GIT_DIFF_FILE_BREAK_REGEX, GapSpan, GetHoveredLineResult, GetLineIndexUtility, HEADER_METADATA_SLOT_ID, HUNK_HEADER, HighlighterTypes, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, HunksRenderResult, INDEX_LINE_METADATA, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSelectionManager, LineSelectionOptions, LineSpans, LineTypes, LogTypes, MouseEventManager, MouseEventManagerBaseOptions, MouseEventManagerMode, MouseEventManagerOptions, ObservedAnnotationNodes, ObservedGridNodes, OnDiffLineClickProps, OnDiffLineEnterLeaveProps, OnLineClickProps, OnLineEnterLeaveProps, ParsedLine, ParsedPatch, PrePropertiesConfig, RecallToken, RegisteredCustomLanguages, RegisteredCustomThemes, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, ResizeManager, ResolvedLanguages, ResolvedThemes, ResolvingLanguages, ResolvingThemes, SPLIT_WITH_NEWLINES, SVGSpriteNames, SVGSpriteSheet, ScrollSyncManager, SelectedLineRange, SelectionSide, SharedRenderState, ShikiStreamTokenizer, ShikiStreamTokenizerEnqueueResult, ShikiStreamTokenizerOptions, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE, VirtualFileMetrics, VirtualWindowSpecs, VirtualizedFile, VirtualizedFileDiff, Virtualizer, VirtualizerConfig, areDiffLineAnnotationsEqual, areFilesEqual, areHunkDataEqual, areLanguagesAttached, areLineAnnotationsEqual, areObjectsEqual, areOptionsEqual, arePrePropertiesEqual, areRenderRangesEqual, areSelectionsEqual, areThemesAttached, areThemesEqual, areVirtualWindowSpecsEqual, areWorkerStatsEqual, attachResolvedLanguages, attachResolvedThemes, cleanLastNewline, cleanUpResolvedLanguages, cleanUpResolvedThemes, codeToHtml, createAnnotationElement, createAnnotationWrapperNode, createCSSVariablesTheme, createDiffSpanDecoration, createEmptyRowBuffer, createFileHeaderElement, createGutterGap, createGutterItem, createGutterWrapper, createHastElement, createHoverContentNode, createIconElement, createNoNewlineElement, createPreElement, createPreWrapperProperties, createRowNodes, createSeparator, createSpanFromToken, createStyleElement, createTextNodeElement, createTransformerWithState, createUnsafeCSSStyleNode, createWindowFromScrollPosition, diffAcceptRejectHunk, disposeHighlighter, extendFileFormatMap, findCodeElement, formatCSSVariablePrefix, getFiletypeFromFileName, getHighlighterIfLoaded, getHighlighterOptions, getHighlighterThemeStyles, getHunkSeparatorSlotName, getIconForType, getLineAnnotationName, getLineEndingType, getLineNodes, getOrCreateCodeNode, getResolvedLanguages, getResolvedOrResolveLanguage, getResolvedOrResolveTheme, getResolvedThemes, getSharedHighlighter, getSingularPatch, getThemes, getTotalLineCountFromHunks, hasResolvedLanguages, hasResolvedThemes, isDefaultRenderRange, isHighlighterLoaded, isHighlighterLoading, isHighlighterNull, isWorkerContext, parseDiffFromFile, parseLineType, parsePatchFiles, pluckLineSelectionOptions, pluckMouseEventOptions, preloadHighlighter, prerenderHTMLIfNecessary, processFile, processLine, processPatch, pushOrJoinSpan, queueRender, registerCustomCSSVariableTheme, registerCustomLanguage, registerCustomTheme, renderDiffWithHighlighter, renderFileWithHighlighter, resolveLanguage, resolveLanguages, resolveTheme, resolveThemes, setLanguageOverride, setPreNodeProperties, trimPatchContext, wrapCoreCSS, wrapUnsafeCSS };
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerPoolContext.d.ts","names":["Context","ReactNode","SetupWorkerPoolProps","WorkerInitializationRenderOptions","WorkerPoolManager","WorkerPoolOptions","WorkerPoolContext","WorkerPoolContextProps","WorkerPoolContextProvider","children","poolOptions","highlighterOptions","React","JSX","Element","useWorkerPool"],"sources":["../../src/react/WorkerPoolContext.d.ts"],"sourcesContent":["import { type Context, type ReactNode } from 'react';\nimport { type SetupWorkerPoolProps, type WorkerInitializationRenderOptions, type WorkerPoolManager, type WorkerPoolOptions } from '../worker';\nexport type { WorkerPoolOptions, WorkerInitializationRenderOptions };\nexport declare const WorkerPoolContext: Context<WorkerPoolManager | undefined>;\ninterface WorkerPoolContextProps extends SetupWorkerPoolProps {\n children: ReactNode;\n}\nexport declare function WorkerPoolContextProvider({ children, poolOptions, highlighterOptions }: WorkerPoolContextProps): React.JSX.Element;\nexport declare function useWorkerPool(): WorkerPoolManager | undefined;\n//# sourceMappingURL=WorkerPoolContext.d.ts.map"],"mappings":";;;;;;;cAGqBM,mBAAmBN,QAAQI;UACtCG,sBAAAA,SAA+BL;YAC3BD;;AAFOK,iBAIGE,yBAAAA,CAJwBJ;EAAAA,QAARJ;EAAAA,WAAO;EAAA;AAAA,CAAA,EAIkDO,sBAJlD,CAAA,EAI2EK,KAAAA,CAAMC,GAAAA,CAAIC,OAJrF;AACrCP,iBAIcQ,aAAAA,CAAAA,CAJQ,EAISX,iBAJAF,GAAAA,SAAAA"}
1
+ {"version":3,"file":"WorkerPoolContext.d.ts","names":["Context","ReactNode","SetupWorkerPoolProps","WorkerInitializationRenderOptions","WorkerPoolManager","WorkerPoolOptions","WorkerPoolContext","WorkerPoolContextProps","WorkerPoolContextProvider","children","poolOptions","highlighterOptions","React","JSX","Element","useWorkerPool"],"sources":["../../src/react/WorkerPoolContext.d.ts"],"sourcesContent":["import { type Context, type ReactNode } from 'react';\nimport { type SetupWorkerPoolProps, type WorkerInitializationRenderOptions, type WorkerPoolManager, type WorkerPoolOptions } from '../worker';\nexport type { WorkerPoolOptions, WorkerInitializationRenderOptions };\nexport declare const WorkerPoolContext: Context<WorkerPoolManager | undefined>;\ninterface WorkerPoolContextProps extends SetupWorkerPoolProps {\n children: ReactNode;\n}\nexport declare function WorkerPoolContextProvider({ children, poolOptions, highlighterOptions }: WorkerPoolContextProps): React.JSX.Element;\nexport declare function useWorkerPool(): WorkerPoolManager | undefined;\n//# sourceMappingURL=WorkerPoolContext.d.ts.map"],"mappings":";;;;;;;cAGqBM,mBAAmBN,QAAQI;UACtCG,sBAAAA,SAA+BL;YAC3BD;;AAFOK,iBAIGE,yBAAAA,CAJwBJ;EAAAA,QAARJ;EAAO,WAAA;EAAA;AAAA,CAAA,EAIkDO,sBAJlD,CAAA,EAI2EK,KAAAA,CAAMC,GAAAA,CAAIC,OAJrF;AACrCP,iBAIcQ,aAAAA,CAAAA,CAJQ,EAISX,iBAJAF,GAAAA,SAAAA"}
@@ -1,4 +1,4 @@
1
- import { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent, ChangeTypes, CodeColumnType, CodeToHastOptions, ContextContent, DecorationItem, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, FileContents, FileDiffMetadata, ForceDiffPlainTextOptions, ForceFilePlainTextOptions, GapSpan, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PrePropertiesConfig, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SelectionSide, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, VirtualFileMetrics, VirtualWindowSpecs } from "../types.js";
1
+ import { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent, ChangeTypes, CodeColumnType, CodeToHastOptions, ContextContent, DecorationItem, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, FileContents, FileDiffMetadata, ForceDiffPlainTextOptions, ForceFilePlainTextOptions, GapSpan, HighlighterTypes, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PrePropertiesConfig, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SelectionSide, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, VirtualFileMetrics, VirtualWindowSpecs } from "../types.js";
2
2
  import { WorkerInitializationRenderOptions, WorkerPoolOptions } from "../worker/types.js";
3
3
  import { FileOptions } from "../components/File.js";
4
4
  import { DiffBasePropsReact, FileProps } from "./types.js";
@@ -15,4 +15,4 @@ import { templateRender } from "./utils/templateRender.js";
15
15
  import { useFileDiffInstance } from "./utils/useFileDiffInstance.js";
16
16
  import { useFileInstance } from "./utils/useFileInstance.js";
17
17
  import { useStableCallback } from "./utils/useStableCallback.js";
18
- export { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent, ChangeTypes, CodeColumnType, CodeToHastOptions, ContextContent, DecorationItem, DiffBasePropsReact, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, File, FileContents, FileDiff, FileDiffMetadata, FileDiffProps, FileOptions, FileProps, ForceDiffPlainTextOptions, ForceFilePlainTextOptions, GapSpan, HoverSlotStyles, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, MultiFileDiff, MultiFileDiffProps, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PatchDiff, PatchDiffProps, PrePropertiesConfig, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SelectionSide, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, VirtualFileMetrics, VirtualWindowSpecs, Virtualizer, VirtualizerContext, WorkerInitializationRenderOptions, WorkerPoolContext, WorkerPoolContextProvider, WorkerPoolOptions, renderDiffChildren, renderFileChildren, templateRender, useFileDiffInstance, useFileInstance, useStableCallback, useVirtualizer, useWorkerPool };
18
+ export { AnnotationLineMap, AnnotationSide, AnnotationSpan, BaseCodeOptions, BaseDiffOptions, BundledLanguage, ChangeContent, ChangeTypes, CodeColumnType, CodeToHastOptions, ContextContent, DecorationItem, DiffBasePropsReact, DiffLineAnnotation, DiffLineEventBaseProps, DiffsHighlighter, DiffsThemeNames, ExpansionDirections, ExtensionFormatMap, File, FileContents, FileDiff, FileDiffMetadata, FileDiffProps, FileOptions, FileProps, ForceDiffPlainTextOptions, ForceFilePlainTextOptions, GapSpan, HighlighterTypes, HoverSlotStyles, Hunk, HunkData, HunkExpansionRegion, HunkLineType, HunkSeparators, LanguageRegistration, LineAnnotation, LineDiffTypes, LineEventBaseProps, LineInfo, LineSpans, LineTypes, MultiFileDiff, MultiFileDiffProps, ObservedAnnotationNodes, ObservedGridNodes, ParsedPatch, PatchDiff, PatchDiffProps, PrePropertiesConfig, RenderDiffFilesResult, RenderDiffOptions, RenderDiffResult, RenderFileMetadata, RenderFileOptions, RenderFileResult, RenderHeaderMetadataCallback, RenderHeaderMetadataProps, RenderRange, RenderWindow, RenderedDiffASTCache, RenderedFileASTCache, SelectionSide, SharedRenderState, ShikiTransformer, SupportedLanguages, ThemeRegistrationResolved, ThemeTypes, ThemedDiffResult, ThemedFileResult, ThemedToken, ThemesType, VirtualFileMetrics, VirtualWindowSpecs, Virtualizer, VirtualizerContext, WorkerInitializationRenderOptions, WorkerPoolContext, WorkerPoolContextProvider, WorkerPoolOptions, renderDiffChildren, renderFileChildren, templateRender, useFileDiffInstance, useFileInstance, useStableCallback, useVirtualizer, useWorkerPool };
@@ -1 +1 @@
1
- {"version":3,"file":"jsx.d.ts","names":["DIFFS_TAG_NAME","_0","HTMLElement","React","HTMLAttributes","DetailedHTMLProps","sideEffect"],"sources":["../../src/react/jsx.d.ts"],"sourcesContent":["import 'react';\nimport type { DIFFS_TAG_NAME } from '../constants';\n\ndeclare module 'react' {\n namespace JSX {\n interface IntrinsicElements {\n [DIFFS_TAG_NAME]: React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLElement>,\n HTMLElement\n >;\n }\n }\n}\n"],"mappings":";;;;;EACmD,UAAA,GAAA,CAAA;IAAA,UAAA,iBAAA,CAAA;OAK5CA,cAAAA,CAL4C,EAK3BG,KAAAA,CAAME,iBALqB,CAM3CF,KAAAA,CAAMC,cAAeF,CAAAA,WAAAA,CAAAA,EACrBA,WADME,CACNF;IAFgBC;EAAjBH"}
1
+ {"version":3,"file":"jsx.d.ts","names":["DIFFS_TAG_NAME","_1","HTMLElement","React","HTMLAttributes","DetailedHTMLProps","sideEffect"],"sources":["../../src/react/jsx.d.ts"],"sourcesContent":["import 'react';\nimport type { DIFFS_TAG_NAME } from '../constants';\n\ndeclare module 'react' {\n namespace JSX {\n interface IntrinsicElements {\n [DIFFS_TAG_NAME]: React.DetailedHTMLProps<\n React.HTMLAttributes<HTMLElement>,\n HTMLElement\n >;\n }\n }\n}\n"],"mappings":";;;;;EACmD,UAAA,GAAA,CAAA;IAAA,UAAA,iBAAA,CAAA;OAK5CA,cAAAA,CAL4C,EAK3BG,KAAAA,CAAME,iBALqB,CAM3CF,KAAAA,CAAMC,cAAeF,CAAAA,WAAAA,CAAAA,EACrBA,WADME,CACNF;IAFgBC;EAAjBH"}