@pierre/diffs 1.3.0-beta.4 → 1.3.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -15
- package/dist/components/CodeView.d.ts +10 -11
- package/dist/components/CodeView.d.ts.map +1 -1
- package/dist/components/CodeView.js +14 -14
- package/dist/components/CodeView.js.map +1 -1
- package/dist/components/File.d.ts +4 -4
- package/dist/components/File.d.ts.map +1 -1
- package/dist/components/File.js +53 -24
- package/dist/components/File.js.map +1 -1
- package/dist/components/FileDiff.d.ts +19 -18
- package/dist/components/FileDiff.d.ts.map +1 -1
- package/dist/components/FileDiff.js +89 -58
- package/dist/components/FileDiff.js.map +1 -1
- package/dist/components/FileStream.d.ts +0 -1
- package/dist/components/FileStream.d.ts.map +1 -1
- package/dist/components/FileStream.js +8 -6
- package/dist/components/FileStream.js.map +1 -1
- package/dist/components/UnresolvedFile.d.ts +1 -2
- package/dist/components/UnresolvedFile.d.ts.map +1 -1
- package/dist/components/UnresolvedFile.js +3 -3
- package/dist/components/UnresolvedFile.js.map +1 -1
- package/dist/components/VirtualizedFile.d.ts +5 -2
- package/dist/components/VirtualizedFile.d.ts.map +1 -1
- package/dist/components/VirtualizedFile.js +97 -35
- package/dist/components/VirtualizedFile.js.map +1 -1
- package/dist/components/VirtualizedFileDiff.d.ts +8 -4
- package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
- package/dist/components/VirtualizedFileDiff.js +91 -30
- package/dist/components/VirtualizedFileDiff.js.map +1 -1
- package/dist/components/Virtualizer.d.ts +1 -1
- package/dist/components/Virtualizer.d.ts.map +1 -1
- package/dist/components/Virtualizer.js +23 -24
- package/dist/components/Virtualizer.js.map +1 -1
- package/dist/components/VirtulizerDevelopment.d.ts.map +1 -1
- package/dist/components/web-components.d.ts.map +1 -1
- package/dist/components/web-components.js +2 -3
- package/dist/components/web-components.js.map +1 -1
- package/dist/constants.d.ts +3 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +3 -2
- package/dist/constants.js.map +1 -1
- package/dist/editor/command.d.ts +3 -2
- package/dist/editor/command.d.ts.map +1 -1
- package/dist/editor/command.js +10 -6
- package/dist/editor/command.js.map +1 -1
- package/dist/editor/editStack.d.ts +7 -1
- package/dist/editor/editStack.d.ts.map +1 -1
- package/dist/editor/editStack.js +3 -3
- package/dist/editor/editStack.js.map +1 -1
- package/dist/editor/editor.d.ts +56 -6
- package/dist/editor/editor.d.ts.map +1 -1
- package/dist/editor/editor.js +758 -397
- package/dist/editor/editor.js.map +1 -1
- package/dist/editor/editor2.js +3 -3
- package/dist/editor/editor2.js.map +1 -1
- package/dist/editor/index.d.ts +2 -2
- package/dist/editor/index.js +1 -2
- package/dist/editor/lineAnnotations.d.ts.map +1 -1
- package/dist/editor/lineAnnotations.js +2 -3
- package/dist/editor/lineAnnotations.js.map +1 -1
- package/dist/editor/marker.d.ts +4 -3
- package/dist/editor/marker.d.ts.map +1 -1
- package/dist/editor/marker.js +30 -13
- package/dist/editor/marker.js.map +1 -1
- package/dist/editor/pieceTable.d.ts +10 -3
- package/dist/editor/pieceTable.d.ts.map +1 -1
- package/dist/editor/pieceTable.js +170 -129
- package/dist/editor/pieceTable.js.map +1 -1
- package/dist/editor/platform.d.ts +8 -1
- package/dist/editor/platform.d.ts.map +1 -1
- package/dist/editor/platform.js +16 -5
- package/dist/editor/platform.js.map +1 -1
- package/dist/editor/searchPanel.d.ts +13 -3
- package/dist/editor/searchPanel.d.ts.map +1 -1
- package/dist/editor/searchPanel.js +194 -67
- package/dist/editor/searchPanel.js.map +1 -1
- package/dist/editor/selection.d.ts +41 -4
- package/dist/editor/selection.d.ts.map +1 -1
- package/dist/editor/selection.js +423 -83
- package/dist/editor/selection.js.map +1 -1
- package/dist/editor/selectionAction.d.ts +4 -5
- package/dist/editor/selectionAction.d.ts.map +1 -1
- package/dist/editor/selectionAction.js +14 -64
- package/dist/editor/selectionAction.js.map +1 -1
- package/dist/editor/sprite.d.ts +2 -2
- package/dist/editor/sprite.d.ts.map +1 -1
- package/dist/editor/sprite.js +8 -8
- package/dist/editor/sprite.js.map +1 -1
- package/dist/editor/textDocument.d.ts +5 -4
- package/dist/editor/textDocument.d.ts.map +1 -1
- package/dist/editor/textDocument.js +26 -15
- package/dist/editor/textDocument.js.map +1 -1
- package/dist/editor/textMeasure.d.ts +37 -3
- package/dist/editor/textMeasure.d.ts.map +1 -1
- package/dist/editor/textMeasure.js +85 -10
- package/dist/editor/textMeasure.js.map +1 -1
- package/dist/editor/tokenzier.d.ts +1 -0
- package/dist/editor/tokenzier.d.ts.map +1 -1
- package/dist/editor/tokenzier.js +25 -19
- package/dist/editor/tokenzier.js.map +1 -1
- package/dist/editor/utils.d.ts +2 -1
- package/dist/editor/utils.d.ts.map +1 -1
- package/dist/editor/utils.js +6 -3
- package/dist/editor/utils.js.map +1 -1
- package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
- package/dist/highlighter/languages/areLanguagesAttached.js +1 -2
- package/dist/highlighter/languages/areLanguagesAttached.js.map +1 -1
- package/dist/highlighter/languages/attachResolvedLanguages.d.ts +0 -2
- package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/attachResolvedLanguages.js +1 -2
- package/dist/highlighter/languages/attachResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/cleanUpResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/cleanUpResolvedLanguages.js +1 -2
- package/dist/highlighter/languages/cleanUpResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/constants.d.ts +0 -1
- package/dist/highlighter/languages/constants.d.ts.map +1 -1
- package/dist/highlighter/languages/constants.js +1 -1
- package/dist/highlighter/languages/constants.js.map +1 -1
- package/dist/highlighter/languages/getResolvedLanguages.d.ts +0 -2
- package/dist/highlighter/languages/getResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/getResolvedLanguages.js +1 -2
- package/dist/highlighter/languages/getResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +0 -2
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.js +1 -2
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.js.map +1 -1
- package/dist/highlighter/languages/hasResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/hasResolvedLanguages.js +1 -2
- package/dist/highlighter/languages/hasResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/registerCustomLanguage.d.ts +0 -1
- package/dist/highlighter/languages/registerCustomLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/registerCustomLanguage.js +1 -2
- package/dist/highlighter/languages/registerCustomLanguage.js.map +1 -1
- package/dist/highlighter/languages/resolveLanguage.d.ts +0 -2
- package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/resolveLanguage.js +4 -5
- package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
- package/dist/highlighter/languages/resolveLanguages.d.ts +0 -2
- package/dist/highlighter/languages/resolveLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/resolveLanguages.js +1 -2
- package/dist/highlighter/languages/resolveLanguages.js.map +1 -1
- package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
- package/dist/highlighter/shared_highlighter.js +3 -4
- package/dist/highlighter/shared_highlighter.js.map +1 -1
- package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
- package/dist/highlighter/themes/areThemesAttached.js +1 -2
- package/dist/highlighter/themes/areThemesAttached.js.map +1 -1
- package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/attachResolvedThemes.js +1 -2
- package/dist/highlighter/themes/attachResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/cleanUpResolvedThemes.js +1 -2
- package/dist/highlighter/themes/cleanUpResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/constants.d.ts.map +1 -1
- package/dist/highlighter/themes/constants.js +1 -1
- package/dist/highlighter/themes/constants.js.map +1 -1
- package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/getResolvedOrResolveTheme.js +1 -2
- package/dist/highlighter/themes/getResolvedOrResolveTheme.js.map +1 -1
- package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/getResolvedThemes.js +1 -2
- package/dist/highlighter/themes/getResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/hasResolvedThemes.js +1 -2
- package/dist/highlighter/themes/hasResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.js +1 -2
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.js.map +1 -1
- package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/registerCustomTheme.js +1 -2
- package/dist/highlighter/themes/registerCustomTheme.js.map +1 -1
- package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/resolveTheme.js +1 -2
- package/dist/highlighter/themes/resolveTheme.js.map +1 -1
- package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/resolveThemes.js +1 -2
- package/dist/highlighter/themes/resolveThemes.js.map +1 -1
- package/dist/highlighter/themes/themeResolution.d.ts.map +1 -1
- package/dist/highlighter/themes/themeResolution.js +1 -2
- package/dist/highlighter/themes/themeResolution.js.map +1 -1
- package/dist/highlighter/themes/themeResolver.d.ts +2 -2
- package/dist/highlighter/themes/themeResolver.d.ts.map +1 -1
- package/dist/highlighter/themes/themeResolver.js +1 -2
- package/dist/highlighter/themes/themeResolver.js.map +1 -1
- package/dist/index.d.ts +10 -10
- package/dist/index.js +2 -3
- package/dist/managers/InteractionManager.d.ts +7 -0
- package/dist/managers/InteractionManager.d.ts.map +1 -1
- package/dist/managers/InteractionManager.js +26 -4
- package/dist/managers/InteractionManager.js.map +1 -1
- package/dist/managers/ResizeManager.d.ts.map +1 -1
- package/dist/managers/ResizeManager.js +2 -2
- package/dist/managers/ResizeManager.js.map +1 -1
- package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
- package/dist/managers/ScrollSyncManager.js +1 -1
- package/dist/managers/ScrollSyncManager.js.map +1 -1
- package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
- package/dist/managers/UniversalRenderingManager.js +2 -2
- package/dist/managers/UniversalRenderingManager.js.map +1 -1
- package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts +228 -0
- package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts.map +1 -0
- package/dist/node_modules/.pnpm/@types_unist@3.0.3/node_modules/@types/unist/index.d.ts +84 -0
- package/dist/node_modules/.pnpm/@types_unist@3.0.3/node_modules/@types/unist/index.d.ts.map +1 -0
- package/dist/react/CodeView.d.ts +1 -1
- package/dist/react/CodeView.d.ts.map +1 -1
- package/dist/react/CodeView.js +16 -15
- package/dist/react/CodeView.js.map +1 -1
- package/dist/react/EditorContext.d.ts +0 -1
- package/dist/react/EditorContext.d.ts.map +1 -1
- package/dist/react/EditorContext.js +2 -5
- package/dist/react/EditorContext.js.map +1 -1
- package/dist/react/File.d.ts +1 -0
- package/dist/react/File.d.ts.map +1 -1
- package/dist/react/File.js +4 -6
- package/dist/react/File.js.map +1 -1
- package/dist/react/FileDiff.d.ts +1 -0
- package/dist/react/FileDiff.d.ts.map +1 -1
- package/dist/react/FileDiff.js +4 -6
- package/dist/react/FileDiff.js.map +1 -1
- package/dist/react/MultiFileDiff.d.ts +1 -0
- package/dist/react/MultiFileDiff.d.ts.map +1 -1
- package/dist/react/MultiFileDiff.js +4 -6
- package/dist/react/MultiFileDiff.js.map +1 -1
- package/dist/react/PatchDiff.d.ts +1 -0
- package/dist/react/PatchDiff.d.ts.map +1 -1
- package/dist/react/PatchDiff.js +4 -6
- package/dist/react/PatchDiff.js.map +1 -1
- package/dist/react/UnresolvedFile.d.ts +2 -1
- package/dist/react/UnresolvedFile.d.ts.map +1 -1
- package/dist/react/UnresolvedFile.js +4 -6
- package/dist/react/UnresolvedFile.js.map +1 -1
- package/dist/react/Virtualizer.d.ts.map +1 -1
- package/dist/react/Virtualizer.js +2 -5
- package/dist/react/Virtualizer.js.map +1 -1
- package/dist/react/WorkerPoolContext.d.ts +0 -1
- package/dist/react/WorkerPoolContext.d.ts.map +1 -1
- package/dist/react/WorkerPoolContext.js +2 -5
- package/dist/react/WorkerPoolContext.js.map +1 -1
- package/dist/react/constants.d.ts.map +1 -1
- package/dist/react/constants.js +1 -1
- package/dist/react/constants.js.map +1 -1
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.js +1 -2
- package/dist/react/jsx.d.ts +0 -2
- package/dist/react/jsx.d.ts.map +1 -1
- package/dist/react/types.d.ts +2 -0
- package/dist/react/types.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.d.ts +2 -0
- package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.js +18 -11
- package/dist/react/utils/renderDiffChildren.js.map +1 -1
- package/dist/react/utils/renderFileChildren.d.ts +2 -0
- package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
- package/dist/react/utils/renderFileChildren.js +18 -11
- package/dist/react/utils/renderFileChildren.js.map +1 -1
- package/dist/react/utils/templateRender.d.ts.map +1 -1
- package/dist/react/utils/templateRender.js +1 -2
- package/dist/react/utils/templateRender.js.map +1 -1
- package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
- package/dist/react/utils/useFileDiffInstance.js +1 -3
- package/dist/react/utils/useFileDiffInstance.js.map +1 -1
- package/dist/react/utils/useFileInstance.d.ts.map +1 -1
- package/dist/react/utils/useFileInstance.js +1 -2
- package/dist/react/utils/useFileInstance.js.map +1 -1
- package/dist/react/utils/useStableCallback.d.ts.map +1 -1
- package/dist/react/utils/useStableCallback.js +1 -2
- package/dist/react/utils/useStableCallback.js.map +1 -1
- package/dist/react/utils/useUnresolvedFileInstance.d.ts.map +1 -1
- package/dist/react/utils/useUnresolvedFileInstance.js +10 -11
- package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -1
- package/dist/renderers/DiffHunksRenderer.d.ts +5 -5
- package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/DiffHunksRenderer.js +73 -20
- package/dist/renderers/DiffHunksRenderer.js.map +1 -1
- package/dist/renderers/FileRenderer.d.ts +1 -3
- package/dist/renderers/FileRenderer.d.ts.map +1 -1
- package/dist/renderers/FileRenderer.js +23 -8
- package/dist/renderers/FileRenderer.js.map +1 -1
- package/dist/renderers/UnresolvedFileHunksRenderer.d.ts +1 -2
- package/dist/renderers/UnresolvedFileHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/UnresolvedFileHunksRenderer.js +1 -2
- package/dist/renderers/UnresolvedFileHunksRenderer.js.map +1 -1
- package/dist/shiki-stream/index.js +1 -2
- package/dist/shiki-stream/stream.d.ts +0 -1
- package/dist/shiki-stream/stream.d.ts.map +1 -1
- package/dist/shiki-stream/stream.js +1 -2
- package/dist/shiki-stream/stream.js.map +1 -1
- package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
- package/dist/shiki-stream/tokenizer.js +1 -1
- package/dist/shiki-stream/tokenizer.js.map +1 -1
- package/dist/shiki-stream/types.d.ts +0 -1
- package/dist/shiki-stream/types.d.ts.map +1 -1
- package/dist/sprite.d.ts.map +1 -1
- package/dist/sprite.js +1 -1
- package/dist/ssr/FileDiffReact.d.ts.map +1 -1
- package/dist/ssr/FileDiffReact.js +4 -7
- package/dist/ssr/FileDiffReact.js.map +1 -1
- package/dist/ssr/index.d.ts +2 -2
- package/dist/ssr/index.js +1 -2
- package/dist/ssr/preloadDiffs.d.ts +1 -1
- package/dist/ssr/preloadDiffs.d.ts.map +1 -1
- package/dist/ssr/preloadDiffs.js +1 -2
- package/dist/ssr/preloadDiffs.js.map +1 -1
- package/dist/ssr/preloadFile.d.ts.map +1 -1
- package/dist/ssr/preloadFile.js +1 -2
- package/dist/ssr/preloadFile.js.map +1 -1
- package/dist/ssr/preloadPatchFile.d.ts.map +1 -1
- package/dist/ssr/preloadPatchFile.js +2 -3
- package/dist/ssr/preloadPatchFile.js.map +1 -1
- package/dist/ssr/renderHTML.d.ts +1 -1
- package/dist/ssr/renderHTML.d.ts.map +1 -1
- package/dist/ssr/renderHTML.js +1 -2
- package/dist/ssr/renderHTML.js.map +1 -1
- package/dist/string-import.d.ts +4 -0
- package/dist/string-import.d.ts.map +1 -1
- package/dist/style.js +3 -3
- package/dist/style.js.map +1 -1
- package/dist/types.d.ts +27 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -1
- package/dist/utils/areDiffLineAnnotationsEqual.js +1 -1
- package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -1
- package/dist/utils/areDiffRenderOptionsEqual.d.ts.map +1 -1
- package/dist/utils/areDiffRenderOptionsEqual.js +1 -2
- package/dist/utils/areDiffRenderOptionsEqual.js.map +1 -1
- package/dist/utils/areDiffTargetsEqual.d.ts.map +1 -1
- package/dist/utils/areDiffTargetsEqual.js +1 -1
- package/dist/utils/areDiffTargetsEqual.js.map +1 -1
- package/dist/utils/areFileRenderOptionsEqual.d.ts.map +1 -1
- package/dist/utils/areFileRenderOptionsEqual.js +1 -2
- package/dist/utils/areFileRenderOptionsEqual.js.map +1 -1
- package/dist/utils/areFilesEqual.d.ts.map +1 -1
- package/dist/utils/areFilesEqual.js +1 -1
- package/dist/utils/areFilesEqual.js.map +1 -1
- package/dist/utils/areHunkDataEqual.d.ts.map +1 -1
- package/dist/utils/areHunkDataEqual.js +1 -1
- package/dist/utils/areHunkDataEqual.js.map +1 -1
- package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -1
- package/dist/utils/areLineAnnotationsEqual.js +1 -1
- package/dist/utils/areLineAnnotationsEqual.js.map +1 -1
- package/dist/utils/areManagedSnapshotsEqual.d.ts.map +1 -1
- package/dist/utils/areManagedSnapshotsEqual.js +1 -1
- package/dist/utils/areManagedSnapshotsEqual.js.map +1 -1
- package/dist/utils/areMergeConflictActionsEqual.d.ts.map +1 -1
- package/dist/utils/areMergeConflictActionsEqual.js +1 -1
- package/dist/utils/areMergeConflictActionsEqual.js.map +1 -1
- package/dist/utils/areObjectsEqual.d.ts.map +1 -1
- package/dist/utils/areObjectsEqual.js +1 -1
- package/dist/utils/areObjectsEqual.js.map +1 -1
- package/dist/utils/areOptionsEqual.d.ts +0 -2
- package/dist/utils/areOptionsEqual.d.ts.map +1 -1
- package/dist/utils/areOptionsEqual.js +1 -2
- package/dist/utils/areOptionsEqual.js.map +1 -1
- package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -1
- package/dist/utils/arePrePropertiesEqual.js +1 -1
- package/dist/utils/arePrePropertiesEqual.js.map +1 -1
- package/dist/utils/areRenderRangesEqual.d.ts.map +1 -1
- package/dist/utils/areRenderRangesEqual.js +1 -1
- package/dist/utils/areRenderRangesEqual.js.map +1 -1
- package/dist/utils/areSelectionPointsEqual.d.ts.map +1 -1
- package/dist/utils/areSelectionPointsEqual.js +1 -1
- package/dist/utils/areSelectionPointsEqual.js.map +1 -1
- package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
- package/dist/utils/areSelectionsEqual.js +1 -1
- package/dist/utils/areSelectionsEqual.js.map +1 -1
- package/dist/utils/areThemesEqual.d.ts.map +1 -1
- package/dist/utils/areThemesEqual.js +1 -1
- package/dist/utils/areThemesEqual.js.map +1 -1
- package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -1
- package/dist/utils/areVirtualWindowSpecsEqual.js +1 -1
- package/dist/utils/areVirtualWindowSpecsEqual.js.map +1 -1
- package/dist/utils/areWorkerStatsEqual.d.ts +0 -2
- package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -1
- package/dist/utils/areWorkerStatsEqual.js +1 -1
- package/dist/utils/areWorkerStatsEqual.js.map +1 -1
- package/dist/utils/cleanLastNewline.d.ts.map +1 -1
- package/dist/utils/cleanLastNewline.js +1 -1
- package/dist/utils/cleanLastNewline.js.map +1 -1
- package/dist/utils/computeEstimatedDiffHeights.d.ts.map +1 -1
- package/dist/utils/computeEstimatedDiffHeights.js +1 -2
- package/dist/utils/computeEstimatedDiffHeights.js.map +1 -1
- package/dist/utils/computeFileOffsets.d.ts +9 -1
- package/dist/utils/computeFileOffsets.d.ts.map +1 -1
- package/dist/utils/computeFileOffsets.js +20 -2
- package/dist/utils/computeFileOffsets.js.map +1 -1
- package/dist/utils/computeVirtualFileMetrics.d.ts.map +1 -1
- package/dist/utils/computeVirtualFileMetrics.js +1 -2
- package/dist/utils/computeVirtualFileMetrics.js.map +1 -1
- package/dist/utils/createAnnotationElement.d.ts +1 -1
- package/dist/utils/createAnnotationElement.d.ts.map +1 -1
- package/dist/utils/createAnnotationElement.js +1 -2
- package/dist/utils/createAnnotationElement.js.map +1 -1
- package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -1
- package/dist/utils/createAnnotationWrapperNode.js +1 -1
- package/dist/utils/createAnnotationWrapperNode.js.map +1 -1
- package/dist/utils/createContentColumn.d.ts +1 -1
- package/dist/utils/createContentColumn.d.ts.map +1 -1
- package/dist/utils/createContentColumn.js +1 -2
- package/dist/utils/createContentColumn.js.map +1 -1
- package/dist/utils/createEmptyRowBuffer.d.ts +1 -1
- package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -1
- package/dist/utils/createEmptyRowBuffer.js +1 -2
- package/dist/utils/createEmptyRowBuffer.js.map +1 -1
- package/dist/utils/createFileHeaderElement.d.ts +1 -1
- package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
- package/dist/utils/createFileHeaderElement.js +6 -3
- package/dist/utils/createFileHeaderElement.js.map +1 -1
- package/dist/utils/createGutterUtilityContentNode.d.ts.map +1 -1
- package/dist/utils/createGutterUtilityContentNode.js +1 -1
- package/dist/utils/createGutterUtilityContentNode.js.map +1 -1
- package/dist/utils/createGutterUtilityElement.d.ts +1 -1
- package/dist/utils/createGutterUtilityElement.d.ts.map +1 -1
- package/dist/utils/createGutterUtilityElement.js +1 -2
- package/dist/utils/createGutterUtilityElement.js.map +1 -1
- package/dist/utils/createNoNewlineElement.d.ts +1 -1
- package/dist/utils/createNoNewlineElement.d.ts.map +1 -1
- package/dist/utils/createNoNewlineElement.js +1 -2
- package/dist/utils/createNoNewlineElement.js.map +1 -1
- package/dist/utils/createPreElement.d.ts +1 -1
- package/dist/utils/createPreElement.d.ts.map +1 -1
- package/dist/utils/createPreElement.js +1 -2
- package/dist/utils/createPreElement.js.map +1 -1
- package/dist/utils/createRowNodes.d.ts.map +1 -1
- package/dist/utils/createRowNodes.js +1 -1
- package/dist/utils/createRowNodes.js.map +1 -1
- package/dist/utils/createSeparator.d.ts +1 -1
- package/dist/utils/createSeparator.d.ts.map +1 -1
- package/dist/utils/createSeparator.js +1 -2
- package/dist/utils/createSeparator.js.map +1 -1
- package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
- package/dist/utils/createSpanNodeFromToken.js +1 -2
- package/dist/utils/createSpanNodeFromToken.js.map +1 -1
- package/dist/utils/createStyleElement.d.ts +1 -1
- package/dist/utils/createStyleElement.d.ts.map +1 -1
- package/dist/utils/createStyleElement.js +1 -2
- package/dist/utils/createStyleElement.js.map +1 -1
- package/dist/utils/createTransformerWithState.d.ts.map +1 -1
- package/dist/utils/createTransformerWithState.js +1 -2
- package/dist/utils/createTransformerWithState.js.map +1 -1
- package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -1
- package/dist/utils/createUnsafeCSSStyleNode.js +1 -2
- package/dist/utils/createUnsafeCSSStyleNode.js.map +1 -1
- package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
- package/dist/utils/createWindowFromScrollPosition.js +5 -5
- package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
- package/dist/utils/cssWrappers.d.ts.map +1 -1
- package/dist/utils/cssWrappers.js +2 -3
- package/dist/utils/cssWrappers.js.map +1 -1
- package/dist/utils/detachString.d.ts.map +1 -1
- package/dist/utils/detachString.js +1 -1
- package/dist/utils/detachString.js.map +1 -1
- package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
- package/dist/utils/diffAcceptRejectHunk.js +1 -2
- package/dist/utils/diffAcceptRejectHunk.js.map +1 -1
- package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -1
- package/dist/utils/formatCSSVariablePrefix.js +1 -1
- package/dist/utils/formatCSSVariablePrefix.js.map +1 -1
- package/dist/utils/getDiffHunksRendererOptions.d.ts.map +1 -1
- package/dist/utils/getDiffHunksRendererOptions.js +1 -1
- package/dist/utils/getDiffHunksRendererOptions.js.map +1 -1
- package/dist/utils/getFileRendererOptions.d.ts.map +1 -1
- package/dist/utils/getFileRendererOptions.js +1 -1
- package/dist/utils/getFileRendererOptions.js.map +1 -1
- package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
- package/dist/utils/getFiletypeFromFileName.js +1 -1
- package/dist/utils/getFiletypeFromFileName.js.map +1 -1
- package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
- package/dist/utils/getHighlighterOptions.js +1 -2
- package/dist/utils/getHighlighterOptions.js.map +1 -1
- package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
- package/dist/utils/getHighlighterThemeStyles.js +1 -2
- package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
- package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -1
- package/dist/utils/getHunkSeparatorSlotName.js +1 -1
- package/dist/utils/getHunkSeparatorSlotName.js.map +1 -1
- package/dist/utils/getIconForType.d.ts.map +1 -1
- package/dist/utils/getIconForType.js +1 -1
- package/dist/utils/getIconForType.js.map +1 -1
- package/dist/utils/getLineAnnotationName.d.ts.map +1 -1
- package/dist/utils/getLineAnnotationName.js +1 -1
- package/dist/utils/getLineAnnotationName.js.map +1 -1
- package/dist/utils/getLineEndingType.d.ts.map +1 -1
- package/dist/utils/getLineEndingType.js +1 -1
- package/dist/utils/getLineEndingType.js.map +1 -1
- package/dist/utils/getLineNodes.d.ts +1 -1
- package/dist/utils/getLineNodes.d.ts.map +1 -1
- package/dist/utils/getLineNodes.js +1 -1
- package/dist/utils/getLineNodes.js.map +1 -1
- package/dist/utils/getMergeConflictActionSlotName.d.ts.map +1 -1
- package/dist/utils/getMergeConflictActionSlotName.js +1 -1
- package/dist/utils/getMergeConflictActionSlotName.js.map +1 -1
- package/dist/utils/getMergeConflictLineTypes.d.ts.map +1 -1
- package/dist/utils/getMergeConflictLineTypes.js +1 -2
- package/dist/utils/getMergeConflictLineTypes.js.map +1 -1
- package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
- package/dist/utils/getOrCreateCodeNode.js +1 -1
- package/dist/utils/getOrCreateCodeNode.js.map +1 -1
- package/dist/utils/getSingularPatch.d.ts.map +1 -1
- package/dist/utils/getSingularPatch.js +1 -2
- package/dist/utils/getSingularPatch.js.map +1 -1
- package/dist/utils/getThemes.d.ts.map +1 -1
- package/dist/utils/getThemes.js +1 -2
- package/dist/utils/getThemes.js.map +1 -1
- package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
- package/dist/utils/getTotalLineCountFromHunks.js +1 -1
- package/dist/utils/getTotalLineCountFromHunks.js.map +1 -1
- package/dist/utils/hast_utils.d.ts +1 -1
- package/dist/utils/hast_utils.d.ts.map +1 -1
- package/dist/utils/hast_utils.js +1 -1
- package/dist/utils/hast_utils.js.map +1 -1
- package/dist/utils/hostTheme.d.ts.map +1 -1
- package/dist/utils/hostTheme.js +1 -2
- package/dist/utils/hostTheme.js.map +1 -1
- package/dist/utils/includesFileAnnotations.d.ts +17 -0
- package/dist/utils/includesFileAnnotations.d.ts.map +1 -0
- package/dist/utils/includesFileAnnotations.js +19 -0
- package/dist/utils/includesFileAnnotations.js.map +1 -0
- package/dist/utils/isDefaultRenderRange.d.ts.map +1 -1
- package/dist/utils/isDefaultRenderRange.js +1 -1
- package/dist/utils/isDefaultRenderRange.js.map +1 -1
- package/dist/utils/isDiffPlainText.d.ts.map +1 -1
- package/dist/utils/isDiffPlainText.js +1 -2
- package/dist/utils/isDiffPlainText.js.map +1 -1
- package/dist/utils/isFilePlainText.d.ts.map +1 -1
- package/dist/utils/isFilePlainText.js +1 -2
- package/dist/utils/isFilePlainText.js.map +1 -1
- package/dist/utils/isStyleNode.d.ts.map +1 -1
- package/dist/utils/isStyleNode.js +1 -1
- package/dist/utils/isStyleNode.js.map +1 -1
- package/dist/utils/isWorkerContext.d.ts.map +1 -1
- package/dist/utils/isWorkerContext.js +1 -1
- package/dist/utils/isWorkerContext.js.map +1 -1
- package/dist/utils/iterateOverDiff.d.ts.map +1 -1
- package/dist/utils/iterateOverDiff.js +44 -45
- package/dist/utils/iterateOverDiff.js.map +1 -1
- package/dist/utils/normalizeDiffResolution.d.ts.map +1 -1
- package/dist/utils/normalizeDiffResolution.js +1 -1
- package/dist/utils/normalizeDiffResolution.js.map +1 -1
- package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
- package/dist/utils/parseDiffDecorations.js +1 -2
- package/dist/utils/parseDiffDecorations.js.map +1 -1
- package/dist/utils/parseDiffFromFile.d.ts +0 -1
- package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
- package/dist/utils/parseDiffFromFile.js +1 -2
- package/dist/utils/parseDiffFromFile.js.map +1 -1
- package/dist/utils/parseLineType.d.ts.map +1 -1
- package/dist/utils/parseLineType.js +1 -1
- package/dist/utils/parseLineType.js.map +1 -1
- package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -1
- package/dist/utils/parseMergeConflictDiffFromFile.js +5 -5
- package/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -1
- package/dist/utils/parsePatchFiles.d.ts.map +1 -1
- package/dist/utils/parsePatchFiles.js +6 -7
- package/dist/utils/parsePatchFiles.js.map +1 -1
- package/dist/utils/prefersReducedMotion.d.ts.map +1 -1
- package/dist/utils/prefersReducedMotion.js +1 -1
- package/dist/utils/prefersReducedMotion.js.map +1 -1
- package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -1
- package/dist/utils/prerenderHTMLIfNecessary.js +1 -1
- package/dist/utils/prerenderHTMLIfNecessary.js.map +1 -1
- package/dist/utils/processLine.d.ts +1 -1
- package/dist/utils/processLine.d.ts.map +1 -1
- package/dist/utils/processLine.js +1 -2
- package/dist/utils/processLine.js.map +1 -1
- package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
- package/dist/utils/renderDiffWithHighlighter.js +8 -7
- package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
- package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
- package/dist/utils/renderFileWithHighlighter.js +5 -4
- package/dist/utils/renderFileWithHighlighter.js.map +1 -1
- package/dist/utils/resolveConflict.d.ts.map +1 -1
- package/dist/utils/resolveConflict.js +1 -2
- package/dist/utils/resolveConflict.js.map +1 -1
- package/dist/utils/resolveRegion.d.ts.map +1 -1
- package/dist/utils/resolveRegion.js +1 -1
- package/dist/utils/resolveRegion.js.map +1 -1
- package/dist/utils/roundToDevicePixel.d.ts.map +1 -1
- package/dist/utils/roundToDevicePixel.js +1 -1
- package/dist/utils/roundToDevicePixel.js.map +1 -1
- package/dist/utils/scrollbarGutter.d.ts.map +1 -1
- package/dist/utils/scrollbarGutter.js +1 -2
- package/dist/utils/scrollbarGutter.js.map +1 -1
- package/dist/utils/setLanguageOverride.d.ts.map +1 -1
- package/dist/utils/setLanguageOverride.js +1 -1
- package/dist/utils/setLanguageOverride.js.map +1 -1
- package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
- package/dist/utils/setWrapperNodeProps.js +1 -1
- package/dist/utils/setWrapperNodeProps.js.map +1 -1
- package/dist/utils/shouldUseTokenTransformer.d.ts.map +1 -1
- package/dist/utils/shouldUseTokenTransformer.js +1 -1
- package/dist/utils/shouldUseTokenTransformer.js.map +1 -1
- package/dist/utils/splitFileContents.d.ts.map +1 -1
- package/dist/utils/splitFileContents.js +1 -2
- package/dist/utils/splitFileContents.js.map +1 -1
- package/dist/utils/trimPatchContext.d.ts.map +1 -1
- package/dist/utils/trimPatchContext.js +1 -2
- package/dist/utils/trimPatchContext.js.map +1 -1
- package/dist/utils/updateDiffHunks.d.ts +2 -1
- package/dist/utils/updateDiffHunks.d.ts.map +1 -1
- package/dist/utils/updateDiffHunks.js +22 -3
- package/dist/utils/updateDiffHunks.js.map +1 -1
- package/dist/utils/virtualDiffLayout.d.ts.map +1 -1
- package/dist/utils/virtualDiffLayout.js +1 -2
- package/dist/utils/virtualDiffLayout.js.map +1 -1
- package/dist/utils/wrapTokenFragments.d.ts +1 -1
- package/dist/utils/wrapTokenFragments.d.ts.map +1 -1
- package/dist/utils/wrapTokenFragments.js +1 -2
- package/dist/utils/wrapTokenFragments.js.map +1 -1
- package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
- package/dist/worker/WorkerPoolManager.js +5 -5
- package/dist/worker/WorkerPoolManager.js.map +1 -1
- package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -1
- package/dist/worker/getOrCreateWorkerPoolSingleton.js +1 -2
- package/dist/worker/getOrCreateWorkerPoolSingleton.js.map +1 -1
- package/dist/worker/index.js +1 -2
- package/dist/worker/types.d.ts.map +1 -1
- package/dist/worker/wasm-B9ZqxnKj.js +8 -0
- package/dist/worker/wasm-B9ZqxnKj.js.map +1 -0
- package/dist/worker/worker-portable.js +2989 -6577
- package/dist/worker/worker-portable.js.map +1 -1
- package/dist/worker/worker.js +97 -127
- package/dist/worker/worker.js.map +1 -1
- package/package.json +14 -21
- package/dist/worker/wasm-BaDzIkIn.js +0 -10
- package/dist/worker/wasm-BaDzIkIn.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualizedFileDiff.js","names":["position: { top: number; height: number } | undefined","anchor: NumericScrollLineAnchor | undefined","result: DiffLayoutCheckpoint | undefined","hunkOffsets: number[]","firstVisibleHunk: number | undefined","centerHunk: number | undefined","overflowCounter: number | undefined","lineHeight","lineIndexes: number[]","offsets: number[]"],"sources":["../../src/components/VirtualizedFileDiff.ts"],"sourcesContent":["import { DEFAULT_COLLAPSED_CONTEXT_THRESHOLD } from '../constants';\nimport type {\n DiffLineAnnotation,\n DiffsTextDocument,\n ExpansionDirections,\n FileDiffMetadata,\n Hunk,\n HunkSeparators,\n NumericScrollLineAnchor,\n PendingCodeViewLayoutReset,\n RenderRange,\n RenderWindow,\n SelectionSide,\n StickySpecs,\n ThemeTypes,\n VirtualFileMetrics,\n} from '../types';\nimport { areDiffTargetsEqual } from '../utils/areDiffTargetsEqual';\nimport { areObjectsEqual } from '../utils/areObjectsEqual';\nimport { areOptionsEqual } from '../utils/areOptionsEqual';\nimport { computeEstimatedDiffHeights } from '../utils/computeEstimatedDiffHeights';\nimport {\n computeVirtualFileMetrics,\n getVirtualFileHeaderRegion,\n getVirtualFilePaddingBottom,\n} from '../utils/computeVirtualFileMetrics';\nimport { iterateOverDiff } from '../utils/iterateOverDiff';\nimport { parseDiffFromFile } from '../utils/parseDiffFromFile';\nimport {\n getExpandedRegion,\n getLeadingHunkSeparatorLayout,\n getTrailingExpandedRegion,\n getTrailingHunkSeparatorLayout,\n} from '../utils/virtualDiffLayout';\nimport type { WorkerPoolManager } from '../worker';\nimport type { CodeView } from './CodeView';\nimport {\n FileDiff,\n type FileDiffOptions,\n type FileDiffRenderProps,\n} from './FileDiff';\nimport type { Virtualizer } from './Virtualizer';\n\ninterface DiffLayoutCheckpoint {\n renderedLineIndex: number;\n lineIndex: number;\n top: number;\n}\n\ninterface DiffLayoutCache {\n // Sparse map: view-specific line index -> measured height delta from the\n // baseline line height. Only stores lines that differ from the estimate.\n heightDeltas: Map<number, number>;\n measuredHeightDeltaTotal: number;\n // Baseline estimated heights for the active diff content. These are preserved\n // across style/collapse toggles and cleared only when estimate inputs change.\n estimatedSplitHeight: number | undefined;\n estimatedUnifiedHeight: number | undefined;\n // Sparse measured positions used to resume deep geometry scans near a target\n // diff line, rendered row, or scroll offset instead of replaying layout from\n // the first hunk.\n checkpoints: DiffLayoutCheckpoint[];\n // Total renderable diff rows for the current diff style and expansion state.\n totalLines: number;\n}\n\ninterface ResetLayoutCacheOptions {\n forceSimpleRecompute?: boolean;\n includeEstimatedHeights?: boolean;\n}\n\nconst LAYOUT_CHECKPOINT_INTERVAL = 5_000;\n\nlet instanceId = -1;\n\nexport class VirtualizedFileDiff<\n LAnnotation = undefined,\n> extends FileDiff<LAnnotation> {\n override readonly __id: string = `little-virtualized-file-diff:${++instanceId}`;\n\n public top: number | undefined;\n public height: number = 0;\n private metrics: VirtualFileMetrics;\n private cache: DiffLayoutCache = {\n heightDeltas: new Map(),\n measuredHeightDeltaTotal: 0,\n estimatedSplitHeight: undefined,\n estimatedUnifiedHeight: undefined,\n checkpoints: [],\n totalLines: 0,\n };\n private isVisible: boolean = false;\n private isSetup: boolean = false;\n private virtualizer: Virtualizer | CodeView<LAnnotation>;\n private layoutDirty = true;\n private forceRenderOverride: true | undefined;\n private currentCollapsed: boolean | undefined;\n\n constructor(\n options: FileDiffOptions<LAnnotation> | undefined,\n virtualizer: Virtualizer | CodeView<LAnnotation>,\n metrics?: Partial<VirtualFileMetrics>,\n workerManager?: WorkerPoolManager,\n isContainerManaged = false\n ) {\n super(options, workerManager, isContainerManaged);\n this.virtualizer = virtualizer;\n this.metrics = computeVirtualFileMetrics(metrics);\n }\n\n public setMetrics(\n metrics?: Partial<VirtualFileMetrics>,\n force = false\n ): void {\n const nextMetrics = computeVirtualFileMetrics(metrics);\n if (!force && areObjectsEqual(this.metrics, nextMetrics)) {\n return;\n }\n\n this.metrics = nextMetrics;\n this.resetLayoutCache({ includeEstimatedHeights: true });\n }\n\n // Get the height for a line, using cached value if available.\n // If not cached and hasMetadataLine is true, adds lineHeight for the metadata.\n private getLineHeight(lineIndex: number, hasMetadataLine = false): number {\n return (\n this.getEstimatedLineHeight(hasMetadataLine) +\n (this.cache.heightDeltas.get(lineIndex) ?? 0)\n );\n }\n\n private getEstimatedLineHeight(hasMetadataLine = false): number {\n const multiplier = hasMetadataLine ? 2 : 1;\n return this.metrics.lineHeight * multiplier;\n }\n\n override setOptions(options: FileDiffOptions<LAnnotation> | undefined): void {\n if (this.isAdvancedMode()) {\n throw new Error(\n 'VirtualizedFileDiff.setOptions cannot be used inside CodeView. Update CodeView options instead.'\n );\n }\n\n if (options == null) return;\n const { options: previousOptions } = this;\n const optionsChanged = !areOptionsEqual(previousOptions, options);\n const layoutChanged =\n optionsChanged && hasDiffLayoutOptionChanged(previousOptions, options);\n\n super.setOptions(options);\n\n if (layoutChanged) {\n this.resetLayoutCache({\n forceSimpleRecompute: true,\n includeEstimatedHeights: hasDiffEstimateOptionChanged(\n previousOptions,\n options\n ),\n });\n }\n // Any option can affect rendered DOM; only layout-affecting options clear\n // the measured height cache above.\n if (optionsChanged) {\n this.forceRenderOverride = true;\n }\n if (optionsChanged && this.isSimpleMode()) {\n this.virtualizer.instanceChanged(this, layoutChanged);\n }\n }\n\n override setThemeType(themeType: ThemeTypes): void {\n if (this.isAdvancedMode()) {\n throw new Error(\n 'VirtualizedFileDiff.setThemeType cannot be used inside CodeView. Update CodeView options instead.'\n );\n }\n\n super.setThemeType(themeType);\n }\n\n private resetLayoutCache({\n forceSimpleRecompute = false,\n includeEstimatedHeights = false,\n }: ResetLayoutCacheOptions = {}): void {\n this.layoutDirty = true;\n if (this.cache.heightDeltas.size > 0) {\n this.cache.heightDeltas.clear();\n }\n if (this.cache.measuredHeightDeltaTotal !== 0) {\n this.cache.measuredHeightDeltaTotal = 0;\n }\n if (this.cache.checkpoints.length > 0) {\n this.cache.checkpoints.length = 0;\n }\n if (this.cache.totalLines !== 0) {\n this.cache.totalLines = 0;\n }\n if (includeEstimatedHeights) {\n this.cache.estimatedSplitHeight = undefined;\n this.cache.estimatedUnifiedHeight = undefined;\n }\n if (this.renderRange != null) {\n this.renderRange = undefined;\n }\n // NOTE(amadeus): In CodeView we intentionally batch computes to all happen\n // at the same time, so we shouldn't trigger this there.\n if (forceSimpleRecompute && this.isSimpleMode()) {\n this.computeApproximateSize();\n }\n }\n\n // Measure rendered lines and update height cache.\n // Called after render to reconcile estimated vs actual heights.\n // Definitely need to optimize this in cases where there aren't any custom\n // line heights or in cases of extremely large files...\n public reconcileHeights(): boolean {\n let hasHeightChange = false;\n const { overflow = 'scroll' } = this.options;\n if (this.fileContainer == null || this.fileDiff == null) {\n if (this.height !== 0) {\n hasHeightChange = true;\n }\n this.height = 0;\n return hasHeightChange;\n }\n this.top = this.getVirtualizedTop();\n // NOTE(amadeus): We can probably be a lot smarter about this, and we\n // should be thinking about ways to improve this\n // If the file has no annotations and we are using the scroll variant, then\n // we can probably skip everything\n if (\n overflow === 'scroll' &&\n this.lineAnnotations.length === 0 &&\n !this.isResizeDebuggingEnabled()\n ) {\n return hasHeightChange;\n }\n const diffStyle = this.getDiffStyle();\n const codeGroups =\n diffStyle === 'split'\n ? [this.codeDeletions, this.codeAdditions]\n : [this.codeUnified];\n\n for (const codeGroup of codeGroups) {\n if (codeGroup == null) continue;\n const content = codeGroup.children[1];\n if (!(content instanceof HTMLElement)) continue;\n for (const line of content.children) {\n if (!(line instanceof HTMLElement)) continue;\n\n const lineIndexAttr = line.dataset.lineIndex;\n if (lineIndexAttr == null) continue;\n\n const lineIndex = parseLineIndex(lineIndexAttr, diffStyle);\n let measuredHeight = line.getBoundingClientRect().height;\n let hasMetadata = false;\n // Annotations or noNewline metadata increase the size of the their\n // attached line\n if (\n line.nextElementSibling instanceof HTMLElement &&\n ('lineAnnotation' in line.nextElementSibling.dataset ||\n 'noNewline' in line.nextElementSibling.dataset)\n ) {\n if ('noNewline' in line.nextElementSibling.dataset) {\n hasMetadata = true;\n }\n measuredHeight +=\n line.nextElementSibling.getBoundingClientRect().height;\n }\n const estimatedHeight = this.getEstimatedLineHeight(hasMetadata);\n const previousDelta = this.cache.heightDeltas.get(lineIndex) ?? 0;\n const nextDelta = measuredHeight - estimatedHeight;\n\n if (nextDelta === previousDelta) {\n continue;\n }\n\n hasHeightChange = true;\n this.cache.measuredHeightDeltaTotal += nextDelta - previousDelta;\n if (nextDelta === 0) {\n this.cache.heightDeltas.delete(lineIndex);\n } else {\n this.cache.heightDeltas.set(lineIndex, nextDelta);\n }\n }\n }\n\n if (hasHeightChange || this.isResizeDebuggingEnabled()) {\n this.computeApproximateSize(true);\n }\n return hasHeightChange;\n }\n\n public onRender = (dirty: boolean): boolean => {\n if (this.fileContainer == null) {\n return false;\n }\n if (dirty) {\n this.top = this.getVirtualizedTop();\n }\n return this.render();\n };\n\n // Prepares this item for CodeView layout by binding the latest diff, syncing\n // its virtualized top, and returning an approximate height. This method is\n // called while downstream items are being re-positioned, so later changes\n // should keep clean instances on a cached-height fast path.\n public prepareCodeViewItem(\n fileDiff: FileDiffMetadata,\n top: number,\n reset?: PendingCodeViewLayoutReset\n ): number {\n const targetChanged = !areDiffTargetsEqual(this.fileDiff, fileDiff);\n let shouldResetLayoutCache =\n reset?.resetDiffLayoutCache === true || targetChanged;\n let includeEstimatedHeights =\n targetChanged ||\n (reset?.resetDiffLayoutCache === true &&\n reset.includeEstimatedDiffHeights);\n\n if (reset?.metrics != null) {\n this.metrics = computeVirtualFileMetrics(reset.metrics);\n shouldResetLayoutCache = true;\n includeEstimatedHeights = true;\n }\n\n const { collapsed = false } = this.options;\n if (this.currentCollapsed !== collapsed) {\n this.currentCollapsed = collapsed;\n shouldResetLayoutCache = true;\n }\n\n if (shouldResetLayoutCache) {\n this.resetLayoutCache({ includeEstimatedHeights });\n }\n this.fileDiff = fileDiff;\n this.top = top;\n this.computeApproximateSize();\n return this.height;\n }\n\n public getLinePosition(\n lineNumber: number,\n side: SelectionSide = 'additions'\n ): { top: number; height: number } | undefined {\n if (this.fileDiff == null) {\n return undefined;\n }\n\n const targetLineIndexes = this.getLineIndex(lineNumber, side);\n if (targetLineIndexes == null) {\n return undefined;\n }\n\n const {\n disableFileHeader = false,\n expandUnchanged = false,\n collapsed = false,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n } = this.options;\n const diffStyle = this.getDiffStyle();\n const hunkSeparators = this.getHunkSeparatorType();\n const targetLineIndex =\n diffStyle === 'split' ? targetLineIndexes[1] : targetLineIndexes[0];\n this.approximateLayoutCheckpoints();\n const checkpoint = this.getLayoutCheckpointBeforeLineIndex(targetLineIndex);\n let top =\n checkpoint?.top ??\n getVirtualFileHeaderRegion(this.metrics, disableFileHeader);\n\n if (collapsed) {\n return { top, height: 0 };\n }\n\n let position: { top: number; height: number } | undefined;\n iterateOverDiff({\n diff: this.fileDiff,\n diffStyle,\n startingLine: checkpoint?.renderedLineIndex ?? 0,\n expandedHunks: expandUnchanged\n ? true\n : this.hunksRenderer.getExpandedHunksMap(),\n collapsedContextThreshold,\n callback: ({\n hunkIndex,\n hunk,\n collapsedBefore,\n collapsedAfter,\n deletionLine,\n additionLine,\n }) => {\n const lineIndex =\n diffStyle === 'split'\n ? (additionLine?.splitLineIndex ?? deletionLine?.splitLineIndex)\n : (additionLine?.unifiedLineIndex ??\n deletionLine?.unifiedLineIndex);\n if (lineIndex == null) {\n throw new Error(\n 'VirtualizedFileDiff.getLinePosition: missing line index data'\n );\n }\n\n if (collapsedBefore > 0) {\n const separator = getLeadingHunkSeparatorLayout({\n type: hunkSeparators,\n metrics: this.metrics,\n hunkIndex,\n hunkSpecs: hunk?.hunkSpecs,\n });\n if (separator != null) {\n top += separator.gapBefore;\n if (\n targetLineIndex >= lineIndex - collapsedBefore &&\n targetLineIndex < lineIndex\n ) {\n position = {\n top,\n height: separator.height,\n };\n return true;\n }\n top += separator.height + separator.gapAfter;\n }\n }\n\n const lineHeight = this.getLineHeight(\n lineIndex,\n (additionLine?.noEOFCR ?? false) || (deletionLine?.noEOFCR ?? false)\n );\n if (lineIndex === targetLineIndex) {\n position = {\n top,\n height: lineHeight,\n };\n return true;\n }\n top += lineHeight;\n\n if (collapsedAfter > 0) {\n const separator = getTrailingHunkSeparatorLayout({\n type: hunkSeparators,\n metrics: this.metrics,\n });\n if (separator != null) {\n if (\n targetLineIndex > lineIndex &&\n targetLineIndex <= lineIndex + collapsedAfter\n ) {\n position = {\n top: top + separator.gapBefore,\n height: separator.height,\n };\n return true;\n }\n top += separator.totalHeight;\n }\n }\n\n return false;\n },\n });\n\n return position;\n }\n\n public getNumericScrollAnchor(\n localViewportTop: number\n ): NumericScrollLineAnchor | undefined {\n if (this.fileDiff == null) {\n return undefined;\n }\n\n const {\n disableFileHeader = false,\n expandUnchanged = false,\n collapsed = false,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n } = this.options;\n if (collapsed) {\n return undefined;\n }\n\n const diffStyle = this.getDiffStyle();\n const hunkSeparators = this.getHunkSeparatorType();\n\n this.approximateLayoutCheckpoints();\n const checkpoint = this.getLayoutCheckpointBeforeTop(localViewportTop);\n let top =\n checkpoint?.top ??\n getVirtualFileHeaderRegion(this.metrics, disableFileHeader);\n let anchor: NumericScrollLineAnchor | undefined;\n\n // This may end up being quite expensive on extremely large files, we may\n // need to figure out how to anchor on different regions, or utilize\n // renderRange to shortcut this for us somehow\n iterateOverDiff({\n diff: this.fileDiff,\n diffStyle,\n startingLine: checkpoint?.renderedLineIndex ?? 0,\n expandedHunks: expandUnchanged\n ? true\n : this.hunksRenderer.getExpandedHunksMap(),\n collapsedContextThreshold,\n callback: ({\n hunkIndex,\n hunk,\n collapsedBefore,\n collapsedAfter,\n deletionLine,\n additionLine,\n }) => {\n const lineIndex =\n diffStyle === 'split'\n ? (additionLine?.splitLineIndex ?? deletionLine?.splitLineIndex)\n : (additionLine?.unifiedLineIndex ??\n deletionLine?.unifiedLineIndex);\n if (lineIndex == null) {\n throw new Error(\n 'VirtualizedFileDiff.getNumericScrollAnchor: missing line index data'\n );\n }\n\n if (collapsedBefore > 0) {\n const separator = getLeadingHunkSeparatorLayout({\n type: hunkSeparators,\n metrics: this.metrics,\n hunkIndex,\n hunkSpecs: hunk?.hunkSpecs,\n });\n if (separator != null) {\n top += separator.totalHeight;\n }\n }\n\n if (top >= localViewportTop) {\n if (deletionLine != null) {\n anchor = {\n lineNumber: deletionLine.lineNumber,\n side: 'deletions',\n top,\n };\n } else if (additionLine != null) {\n anchor = {\n lineNumber: additionLine.lineNumber,\n side: 'additions',\n top,\n };\n }\n if (anchor != null) {\n return true;\n }\n }\n\n const lineHeight = this.getLineHeight(\n lineIndex,\n (additionLine?.noEOFCR ?? false) || (deletionLine?.noEOFCR ?? false)\n );\n top += lineHeight;\n\n if (collapsedAfter > 0) {\n const separator = getTrailingHunkSeparatorLayout({\n type: hunkSeparators,\n metrics: this.metrics,\n });\n if (separator != null) {\n top += separator.totalHeight;\n }\n }\n\n return false;\n },\n });\n\n return anchor;\n }\n\n public getVirtualizedHeight(): number {\n return this.height;\n }\n\n public getAdvancedStickySpecs(\n windowSpecs?: RenderWindow\n ): StickySpecs | undefined {\n if (this.top == null || this.fileDiff == null) {\n return undefined;\n }\n if (this.options.collapsed === true) {\n return { topOffset: this.top, height: this.height };\n }\n const renderRange =\n windowSpecs != null\n ? this.computeRenderRangeFromWindow(\n this.fileDiff,\n this.top,\n windowSpecs\n )\n : this.renderRange;\n if (renderRange == null) {\n return undefined;\n }\n const { bufferBefore, bufferAfter, totalLines } = renderRange;\n // Rendered items flow contiguously in the sticky container with no buffer\n // spacers, so a header-only item (totalLines === 0, none of its rows fall\n // inside the window) must report where its header actually sits in that\n // flow, which depends on which side of the window its content is on:\n // - content ABOVE the window (item starts above window.top): the header\n // sits at the item's bottom so the following item connects, so offset by\n // bufferAfter.\n // - content BELOW the window (item starts at/after window.top, e.g. a\n // trailing header peeking in at the bottom): the header renders at the\n // item's top with nothing after it, so no offset. Always adding\n // bufferAfter here made getStickyBounds over-measure the sticky\n // container for that trailing case.\n let headerOnlyOffset = 0;\n if (totalLines === 0) {\n const activeWindow = windowSpecs ?? this.virtualizer.getWindowSpecs();\n if (this.top < activeWindow.top) {\n headerOnlyOffset = bufferAfter;\n }\n }\n return {\n topOffset: this.top + bufferBefore + headerOnlyOffset,\n height: this.height - (bufferBefore + bufferAfter),\n };\n }\n\n override cleanUp(recycle = false): void {\n if (this.fileContainer != null && this.isSimpleMode()) {\n this.getSimpleVirtualizer()?.disconnect(this.fileContainer);\n }\n if (!recycle) {\n this.resetLayoutCache({ includeEstimatedHeights: true });\n }\n this.isSetup = false;\n super.cleanUp(recycle);\n }\n\n override expandHunk = (\n hunkIndex: number,\n direction: ExpansionDirections,\n expansionLineCountOverride?: number\n ): void => {\n this.hunksRenderer.expandHunk(\n hunkIndex,\n direction,\n expansionLineCountOverride\n );\n this.forceRenderOverride = true;\n this.resetLayoutCache({ includeEstimatedHeights: true });\n if (this.isSimpleMode()) {\n this.computeApproximateSize();\n }\n this.virtualizer.instanceChanged(this, true);\n };\n\n public setVisibility(visible: boolean): void {\n if (this.isAdvancedMode() || this.fileContainer == null) {\n return;\n }\n this.renderRange = undefined;\n if (visible && !this.isVisible) {\n this.top = this.getVirtualizedTop();\n this.isVisible = true;\n } else if (!visible && this.isVisible) {\n this.isVisible = false;\n this.rerender();\n }\n }\n\n override rerender(): void {\n if (\n !this.enabled ||\n (this.fileDiff == null &&\n this.additionFile == null &&\n this.deletionFile == null)\n ) {\n return;\n }\n this.forceRenderOverride = true;\n this.virtualizer.instanceChanged(this, false);\n }\n\n // Normally triggered by the editor when the document line count changes.\n override applyDocumentChange(\n textDocument: DiffsTextDocument,\n newLineAnnotations?: DiffLineAnnotation<LAnnotation>[],\n shouldUpdateBuffer = false\n ): void {\n const previousRenderRange = this.renderRange;\n\n super.applyDocumentChange(textDocument, newLineAnnotations);\n\n this.getSimpleVirtualizer()?.markDOMDirty();\n this.resetLayoutCache({\n forceSimpleRecompute: this.isSimpleMode(),\n includeEstimatedHeights: true,\n });\n\n // Update the buffers caused by the line-count change to ensure the editor\n // scrolls to the correct position before re-rendering\n if (\n shouldUpdateBuffer &&\n previousRenderRange !== undefined &&\n this.fileDiff !== undefined\n ) {\n const windowSpecs = this.virtualizer.getWindowSpecs();\n const renderRange = this.computeRenderRangeFromWindow(\n this.fileDiff,\n this.top ?? 0,\n windowSpecs\n );\n if (renderRange.bufferAfter !== previousRenderRange.bufferAfter) {\n this.updateBuffers(renderRange);\n }\n }\n }\n\n // Compute the approximate size from the cached baseline estimate plus any\n // measured height deltas observed in rendered rows.\n // The reason we refer to this as `approximate size` is because heights my\n // dynamically change for a number of reasons so we can never be fully sure\n // if the height is 100% accurate\n private computeApproximateSize(force = false): void {\n const shouldValidateSize = this.isResizeDebuggingEnabled();\n if (!force && !this.layoutDirty && !shouldValidateSize) {\n return;\n }\n\n const isFirstCompute = this.height === 0;\n this.height = 0;\n this.cache.checkpoints = [];\n this.cache.totalLines = 0;\n if (this.fileDiff == null) {\n this.layoutDirty = false;\n return;\n }\n\n const { disableFileHeader = false, collapsed = false } = this.options;\n const headerRegion = getVirtualFileHeaderRegion(\n this.metrics,\n disableFileHeader\n );\n\n this.height += headerRegion;\n if (collapsed) {\n this.layoutDirty = false;\n return;\n }\n\n this.height =\n this.getActiveEstimatedHeight() + this.cache.measuredHeightDeltaTotal;\n\n if (shouldValidateSize && !isFirstCompute) {\n this.validateComputedHeight();\n }\n this.layoutDirty = false;\n }\n\n private getActiveEstimatedHeight(): number {\n this.ensureEstimatedDiffHeights();\n const estimatedHeight =\n this.getDiffStyle() === 'split'\n ? this.cache.estimatedSplitHeight\n : this.cache.estimatedUnifiedHeight;\n if (estimatedHeight == null) {\n throw new Error(\n 'VirtualizedFileDiff.getActiveEstimatedHeight: missing estimated height'\n );\n }\n return estimatedHeight;\n }\n\n private ensureEstimatedDiffHeights(): void {\n if (this.fileDiff == null) {\n this.cache.estimatedSplitHeight = undefined;\n this.cache.estimatedUnifiedHeight = undefined;\n return;\n }\n if (\n this.cache.estimatedSplitHeight != null &&\n this.cache.estimatedUnifiedHeight != null\n ) {\n return;\n }\n\n const {\n disableFileHeader = false,\n expandUnchanged = false,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n } = this.options;\n const { splitHeight, unifiedHeight } = computeEstimatedDiffHeights({\n fileDiff: this.fileDiff,\n metrics: this.metrics,\n disableFileHeader,\n hunkSeparators: this.getHunkSeparatorType(),\n expandUnchanged,\n expandedHunks: this.hunksRenderer.getExpandedHunksMap(),\n collapsedContextThreshold,\n });\n this.cache.estimatedSplitHeight = splitHeight;\n this.cache.estimatedUnifiedHeight = unifiedHeight;\n }\n\n private validateComputedHeight(): void {\n if (this.fileContainer == null || this.fileDiff == null) {\n return;\n }\n\n const rect = this.fileContainer.getBoundingClientRect();\n if (rect.height !== this.height) {\n console.log(\n 'VirtualizedFileDiff.computeApproximateSize: computed height doesnt match',\n {\n name: this.fileDiff.name,\n elementHeight: rect.height,\n computedHeight: this.height,\n }\n );\n } else {\n console.log(\n 'VirtualizedFileDiff.computeApproximateSize: computed height IS CORRECT'\n );\n }\n }\n\n override render({\n fileContainer,\n oldFile,\n newFile,\n fileDiff,\n forceRender = false,\n ...props\n }: FileDiffRenderProps<LAnnotation> = {}): boolean {\n const { forceRenderOverride, isSetup } = this;\n this.forceRenderOverride = undefined;\n\n this.fileDiff ??=\n fileDiff ??\n (oldFile != null && newFile != null\n ? // NOTE(amadeus): We might be forcing ourselves to double up the\n // computation of fileDiff (in the super.render() call), so we might want\n // to figure out a way to avoid that. That also could be just as simple as\n // passing through fileDiff though... so maybe we good?\n parseDiffFromFile(oldFile, newFile, this.options.parseDiffOptions)\n : undefined);\n\n fileContainer = this.getOrCreateFileContainer(fileContainer);\n\n if (this.fileDiff == null) {\n console.error(\n 'VirtualizedFileDiff.render: attempting to virtually render when we dont have the correct data'\n );\n return false;\n }\n\n if (!isSetup) {\n this.computeApproximateSize();\n const virtualizer = this.getSimpleVirtualizer();\n this.top ??= this.getVirtualizedTop();\n if (this.isAdvancedMode()) {\n this.isVisible = true;\n } else {\n if (virtualizer == null) {\n throw new Error(\n 'VirtualizedFileDiff.render: simple virtualizer is not available'\n );\n }\n virtualizer.connect(fileContainer, this);\n this.isVisible = virtualizer.isInstanceVisible(\n this.top ?? 0,\n this.height\n );\n }\n this.isSetup = true;\n } else {\n this.top ??= this.getVirtualizedTop();\n }\n\n if (!this.isVisible && this.isSimpleMode()) {\n return this.renderPlaceholder(this.height);\n }\n\n const windowSpecs = this.virtualizer.getWindowSpecs();\n const fileTop = this.top ?? 0;\n const renderRange = this.computeRenderRangeFromWindow(\n this.fileDiff,\n fileTop,\n windowSpecs\n );\n return super.render({\n fileDiff: this.fileDiff,\n fileContainer,\n renderRange,\n oldFile,\n newFile,\n forceRender: forceRenderOverride ?? forceRender,\n ...props,\n });\n }\n\n public syncVirtualizedTop(): void {\n this.top = this.getVirtualizedTop();\n }\n\n protected override shouldDisableVirtualizationBuffers(): boolean {\n return this.isAdvancedMode() || super.shouldDisableVirtualizationBuffers();\n }\n\n private isSimpleMode(): boolean {\n return this.virtualizer.type === 'simple';\n }\n\n private isAdvancedMode(): boolean {\n return this.virtualizer.type === 'advanced';\n }\n\n private getVirtualizedTop(): number | undefined {\n if (this.virtualizer.type === 'advanced') {\n return this.virtualizer.getLocalTopForInstance(this);\n }\n return this.fileContainer != null\n ? this.virtualizer.getOffsetInScrollContainer(this.fileContainer)\n : 0;\n }\n\n private getSimpleVirtualizer(): Virtualizer | undefined {\n return this.virtualizer.type === 'simple' ? this.virtualizer : undefined;\n }\n\n private isResizeDebuggingEnabled(): boolean {\n return this.getSimpleVirtualizer()?.config.resizeDebugging ?? false;\n }\n\n private getDiffStyle(): 'split' | 'unified' {\n return this.options.diffStyle ?? 'split';\n }\n\n private getHunkSeparatorType(): HunkSeparators {\n return getOptionHunkSeparatorType(this.options.hunkSeparators);\n }\n\n private approximateLayoutCheckpoints(): void {\n if (\n this.cache.checkpoints.length > 0 ||\n this.fileDiff == null ||\n this.fileDiff.hunks.length === 0 ||\n this.options.collapsed === true\n ) {\n return;\n }\n\n const {\n disableFileHeader = false,\n expandUnchanged = false,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n } = this.options;\n const finalHunkIndex = this.fileDiff.hunks.length - 1;\n const diffStyle = this.getDiffStyle();\n const hunkSeparators = this.getHunkSeparatorType();\n const expandedHunks = expandUnchanged\n ? true\n : this.hunksRenderer.getExpandedHunksMap();\n const heightDeltaPrefix = createHeightDeltaPrefix(this.cache.heightDeltas);\n let top = getVirtualFileHeaderRegion(this.metrics, disableFileHeader);\n let renderedLineIndex = 0;\n\n const processRows = ({\n rowCount,\n startLineIndex,\n preSeparatorHeight = 0,\n postSeparatorHeight = 0,\n metadataOffsets = [],\n }: {\n rowCount: number;\n startLineIndex: number;\n preSeparatorHeight?: number;\n postSeparatorHeight?: number;\n metadataOffsets?: number[];\n }) => {\n if (rowCount <= 0) {\n return;\n }\n\n const blockStart = renderedLineIndex;\n const blockEnd = renderedLineIndex + rowCount;\n let nextCheckpoint = getNextCheckpointIndex(blockStart);\n while (nextCheckpoint < blockEnd) {\n const offset = nextCheckpoint - blockStart;\n const checkpointTop =\n top +\n (offset > 0 ? preSeparatorHeight : 0) +\n offset * this.metrics.lineHeight +\n countMetadataOffsetsBefore(metadataOffsets, offset) *\n this.metrics.lineHeight +\n sumHeightDeltas(\n heightDeltaPrefix,\n startLineIndex,\n startLineIndex + offset\n );\n this.cache.checkpoints.push({\n renderedLineIndex: nextCheckpoint,\n lineIndex: startLineIndex + offset,\n top: checkpointTop,\n });\n nextCheckpoint += LAYOUT_CHECKPOINT_INTERVAL;\n }\n\n top +=\n preSeparatorHeight +\n rowCount * this.metrics.lineHeight +\n metadataOffsets.length * this.metrics.lineHeight +\n sumHeightDeltas(\n heightDeltaPrefix,\n startLineIndex,\n startLineIndex + rowCount\n ) +\n postSeparatorHeight;\n renderedLineIndex = blockEnd;\n };\n\n for (\n let hunkIndex = 0;\n hunkIndex < this.fileDiff.hunks.length;\n hunkIndex++\n ) {\n const hunk = this.fileDiff.hunks[hunkIndex];\n if (hunk == null) {\n throw new Error(\n 'VirtualizedFileDiff.approximateLayoutCheckpoints: invalid hunk index'\n );\n }\n\n const leadingRegion = getExpandedRegion({\n isPartial: this.fileDiff.isPartial,\n rangeSize: hunk.collapsedBefore,\n expandedHunks,\n hunkIndex,\n collapsedContextThreshold,\n });\n const leadingSeparatorHeight =\n leadingRegion.collapsedLines > 0\n ? (getLeadingHunkSeparatorLayout({\n type: hunkSeparators,\n metrics: this.metrics,\n hunkIndex,\n hunkSpecs: hunk.hunkSpecs,\n })?.totalHeight ?? 0)\n : 0;\n\n processRows({\n rowCount: leadingRegion.fromStart,\n startLineIndex:\n (diffStyle === 'split'\n ? hunk.splitLineStart\n : hunk.unifiedLineStart) - leadingRegion.rangeSize,\n });\n\n let pendingLeadingSeparatorHeight = leadingSeparatorHeight;\n processRows({\n rowCount: leadingRegion.fromEnd,\n startLineIndex:\n (diffStyle === 'split'\n ? hunk.splitLineStart\n : hunk.unifiedLineStart) - leadingRegion.fromEnd,\n preSeparatorHeight: pendingLeadingSeparatorHeight,\n });\n if (leadingRegion.fromEnd > 0) {\n pendingLeadingSeparatorHeight = 0;\n }\n\n const trailingRegion =\n hunkIndex === finalHunkIndex\n ? getTrailingExpandedRegion({\n fileDiff: this.fileDiff,\n hunkIndex,\n expandedHunks,\n collapsedContextThreshold,\n errorPrefix: 'VirtualizedFileDiff',\n })\n : undefined;\n const trailingSeparatorHeight =\n trailingRegion != null && trailingRegion.collapsedLines > 0\n ? (getTrailingHunkSeparatorLayout({\n type: hunkSeparators,\n metrics: this.metrics,\n })?.totalHeight ?? 0)\n : 0;\n const trailingExpandedCount =\n trailingRegion != null\n ? trailingRegion.fromStart + trailingRegion.fromEnd\n : 0;\n\n const hunkBodyRowCount =\n diffStyle === 'split' ? hunk.splitLineCount : hunk.unifiedLineCount;\n const hunkBodyStartLineIndex =\n diffStyle === 'split' ? hunk.splitLineStart : hunk.unifiedLineStart;\n processRows({\n rowCount: hunkBodyRowCount,\n startLineIndex: hunkBodyStartLineIndex,\n preSeparatorHeight: pendingLeadingSeparatorHeight,\n postSeparatorHeight:\n trailingExpandedCount === 0 ? trailingSeparatorHeight : 0,\n metadataOffsets: getHunkMetadataOffsets({\n diffStyle,\n hunk,\n rowCount: hunkBodyRowCount,\n }),\n });\n\n if (trailingRegion != null && trailingExpandedCount > 0) {\n processRows({\n rowCount: trailingExpandedCount,\n startLineIndex: hunkBodyStartLineIndex + hunkBodyRowCount,\n postSeparatorHeight: trailingSeparatorHeight,\n });\n }\n }\n\n this.cache.totalLines = renderedLineIndex;\n }\n\n // Find the nearest sparse layout checkpoint at or before an active\n // diff-style line index. Diff checkpoints also store the dense rendered-row\n // index, so deep line-position lookups can resume iteration from that\n // rendered row and replay only the nearby layout work instead of walking\n // from the first hunk.\n private getLayoutCheckpointBeforeLineIndex(\n lineIndex: number\n ): DiffLayoutCheckpoint | undefined {\n if (lineIndex <= 0 || this.cache.checkpoints.length === 0) {\n return undefined;\n }\n\n let low = 0;\n let high = this.cache.checkpoints.length - 1;\n let result: DiffLayoutCheckpoint | undefined;\n\n while (low <= high) {\n const mid = (low + high) >> 1;\n const checkpoint = this.cache.checkpoints[mid];\n if (checkpoint == null) {\n throw new Error('VirtualizedFileDiff: invalid checkpoint index');\n }\n if (checkpoint.lineIndex <= lineIndex) {\n result = checkpoint;\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n\n return result;\n }\n\n // Find the nearest sparse layout checkpoint at or before a scroll offset.\n // Render-range scans start from this checkpoint so variable-height diffs\n // only replay nearby rows. When `hunkLineCount` is provided, step backward\n // to a rendered hunk boundary so buffer calculations can reuse absolute hunk\n // offsets safely.\n private getLayoutCheckpointBeforeTop(\n top: number,\n hunkLineCount?: number\n ): DiffLayoutCheckpoint | undefined {\n let low = 0;\n let high = this.cache.checkpoints.length - 1;\n let resultIndex = -1;\n\n while (low <= high) {\n const mid = (low + high) >> 1;\n const checkpoint = this.cache.checkpoints[mid];\n if (checkpoint == null) {\n throw new Error('VirtualizedFileDiff: invalid checkpoint index');\n }\n if (checkpoint.top <= top) {\n resultIndex = mid;\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n\n if (hunkLineCount == null) {\n return resultIndex >= 0 ? this.cache.checkpoints[resultIndex] : undefined;\n }\n\n for (let index = resultIndex; index >= 0; index--) {\n const checkpoint = this.cache.checkpoints[index];\n if (checkpoint == null) {\n throw new Error('VirtualizedFileDiff: invalid checkpoint index');\n }\n if (checkpoint.renderedLineIndex % hunkLineCount === 0) {\n return checkpoint;\n }\n }\n\n return undefined;\n }\n\n private getExpandedLineCount(\n fileDiff: FileDiffMetadata,\n diffStyle: 'split' | 'unified'\n ): number {\n let count = 0;\n if (fileDiff.isPartial) {\n for (const hunk of fileDiff.hunks) {\n count +=\n diffStyle === 'split' ? hunk.splitLineCount : hunk.unifiedLineCount;\n }\n return count;\n }\n\n const {\n expandUnchanged = false,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n } = this.options;\n const expandedHunks = expandUnchanged\n ? true\n : this.hunksRenderer.getExpandedHunksMap();\n\n for (const [hunkIndex, hunk] of fileDiff.hunks.entries()) {\n const hunkCount =\n diffStyle === 'split' ? hunk.splitLineCount : hunk.unifiedLineCount;\n count += hunkCount;\n const collapsedBefore = Math.max(hunk.collapsedBefore, 0);\n const { fromStart, fromEnd, renderAll } = getExpandedRegion({\n isPartial: fileDiff.isPartial,\n rangeSize: collapsedBefore,\n expandedHunks,\n hunkIndex,\n collapsedContextThreshold,\n });\n if (collapsedBefore > 0) {\n count += renderAll ? collapsedBefore : fromStart + fromEnd;\n }\n }\n\n const trailingRegion = getTrailingExpandedRegion({\n fileDiff,\n hunkIndex: fileDiff.hunks.length - 1,\n expandedHunks,\n collapsedContextThreshold,\n errorPrefix: 'VirtualizedFileDiff',\n });\n if (trailingRegion != null) {\n count += trailingRegion.fromStart + trailingRegion.fromEnd;\n }\n\n return count;\n }\n\n private computeRenderRangeFromWindow(\n fileDiff: FileDiffMetadata,\n fileTop: number,\n { top, bottom }: RenderWindow\n ): RenderRange {\n const {\n disableFileHeader = false,\n expandUnchanged = false,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n } = this.options;\n const { hunkLineCount, lineHeight } = this.metrics;\n const diffStyle = this.getDiffStyle();\n const hunkSeparators = this.getHunkSeparatorType();\n const fileHeight = this.height;\n let lineCount =\n this.cache.totalLines > 0\n ? this.cache.totalLines\n : this.getExpandedLineCount(fileDiff, diffStyle);\n\n const headerRegion = getVirtualFileHeaderRegion(\n this.metrics,\n disableFileHeader\n );\n const paddingBottom =\n fileDiff.hunks.length > 0 ? getVirtualFilePaddingBottom(this.metrics) : 0;\n\n // File is outside render window\n if (fileTop < top - fileHeight || fileTop > bottom) {\n return {\n startingLine: 0,\n totalLines: 0,\n bufferBefore: 0,\n bufferAfter: fileHeight - headerRegion - paddingBottom,\n };\n }\n\n // Whole file is under hunkLineCount, just render it all\n if (lineCount <= hunkLineCount || fileDiff.hunks.length === 0) {\n return {\n startingLine: 0,\n totalLines: hunkLineCount,\n bufferBefore: 0,\n bufferAfter: 0,\n };\n }\n\n this.approximateLayoutCheckpoints();\n lineCount = this.cache.totalLines > 0 ? this.cache.totalLines : lineCount;\n\n const estimatedTargetLines = Math.ceil(\n Math.max(bottom - top, 0) / lineHeight\n );\n const totalLines =\n Math.ceil(estimatedTargetLines / hunkLineCount) * hunkLineCount +\n hunkLineCount;\n const totalHunks = totalLines / hunkLineCount;\n const overflowHunks = totalHunks;\n const hunkOffsets: number[] = [];\n // Halfway between top & bottom, represented as an absolute position\n const viewportCenter = (top + bottom) / 2;\n // Start the scan before the viewport so we collect hunk offsets that may be\n // needed for bufferBefore. This only chooses the scan origin; the returned\n // render range is still computed from the visible window below.\n const checkpoint = this.getLayoutCheckpointBeforeTop(\n Math.max(0, top - fileTop - totalLines * lineHeight * 2),\n hunkLineCount\n );\n\n let absoluteLineTop = fileTop + (checkpoint?.top ?? headerRegion);\n let currentLine = checkpoint?.renderedLineIndex ?? 0;\n let firstVisibleHunk: number | undefined;\n let centerHunk: number | undefined;\n let overflowCounter: number | undefined;\n\n iterateOverDiff({\n diff: fileDiff,\n diffStyle,\n startingLine: checkpoint?.renderedLineIndex ?? 0,\n expandedHunks: expandUnchanged\n ? true\n : this.hunksRenderer.getExpandedHunksMap(),\n collapsedContextThreshold,\n callback: ({\n hunkIndex,\n hunk,\n collapsedBefore,\n collapsedAfter,\n deletionLine,\n additionLine,\n }) => {\n const splitLineIndex =\n additionLine != null\n ? additionLine.splitLineIndex\n : deletionLine.splitLineIndex;\n const unifiedLineIndex =\n additionLine != null\n ? additionLine.unifiedLineIndex\n : deletionLine.unifiedLineIndex;\n const hasMetadata =\n (additionLine?.noEOFCR ?? false) || (deletionLine?.noEOFCR ?? false);\n const leadingSeparator =\n collapsedBefore > 0\n ? getLeadingHunkSeparatorLayout({\n type: hunkSeparators,\n metrics: this.metrics,\n hunkIndex,\n hunkSpecs: hunk?.hunkSpecs,\n })\n : undefined;\n const gapAdjustment = leadingSeparator?.totalHeight ?? 0;\n\n absoluteLineTop += gapAdjustment;\n\n const isAtHunkBoundary = currentLine % hunkLineCount === 0;\n const currentHunk = Math.floor(currentLine / hunkLineCount);\n\n // Track the boundary positional offset at a hunk\n if (isAtHunkBoundary) {\n hunkOffsets[currentHunk] =\n absoluteLineTop - (fileTop + headerRegion + gapAdjustment);\n\n // Check if we should bail (overflow complete)\n if (overflowCounter != null) {\n if (overflowCounter <= 0) {\n return true;\n }\n overflowCounter--;\n }\n }\n\n const lineHeight = this.getLineHeight(\n diffStyle === 'split' ? splitLineIndex : unifiedLineIndex,\n hasMetadata\n );\n\n // Track visible region\n if (absoluteLineTop > top - lineHeight && absoluteLineTop < bottom) {\n firstVisibleHunk ??= currentHunk;\n }\n\n // Track which hunk contains the viewport center\n // If viewport center is above this line and we haven't set centerHunk yet,\n // this is the first line at or past the center\n if (\n centerHunk == null &&\n absoluteLineTop + lineHeight > viewportCenter\n ) {\n centerHunk = currentHunk;\n }\n\n // Start overflow when we are out of the viewport at a hunk boundary\n if (\n overflowCounter == null &&\n absoluteLineTop >= bottom &&\n isAtHunkBoundary\n ) {\n overflowCounter = overflowHunks;\n }\n\n currentLine++;\n absoluteLineTop += lineHeight;\n\n if (collapsedAfter > 0) {\n absoluteLineTop +=\n getTrailingHunkSeparatorLayout({\n type: hunkSeparators,\n metrics: this.metrics,\n })?.totalHeight ?? 0;\n }\n\n return false;\n },\n });\n\n // No visible lines found\n if (firstVisibleHunk == null) {\n return {\n startingLine: 0,\n totalLines: 0,\n bufferBefore: 0,\n bufferAfter: fileHeight - headerRegion - paddingBottom,\n };\n }\n\n // Calculate balanced startingLine centered around the viewport center\n // Fall back to firstVisibleHunk if center wasn't found (e.g., center in a gap)\n centerHunk ??= firstVisibleHunk;\n const idealStartHunk = Math.round(centerHunk - totalHunks / 2);\n\n // Clamp startHunk: at the beginning, reduce totalLines; at the end, shift startHunk back\n const maxStartHunk = Math.max(\n 0,\n Math.ceil(lineCount / hunkLineCount) - totalHunks\n );\n const startHunk = Math.max(0, Math.min(idealStartHunk, maxStartHunk));\n const startingLine = startHunk * hunkLineCount;\n\n // If we wanted to start before 0, reduce totalLines by the clamped amount\n const clampedTotalLines =\n idealStartHunk < 0\n ? totalLines + idealStartHunk * hunkLineCount\n : totalLines;\n\n // Use hunkOffsets array for efficient buffer calculations\n const bufferBefore = hunkOffsets[startHunk] ?? 0;\n\n // Calculate bufferAfter using hunkOffset if available, otherwise use cumulative height\n const finalHunkIndex = startHunk + clampedTotalLines / hunkLineCount;\n const bufferAfter =\n finalHunkIndex < hunkOffsets.length\n ? fileHeight -\n headerRegion -\n hunkOffsets[finalHunkIndex] -\n // We gotta subtract the bottom padding off of the buffer\n paddingBottom\n : // We stopped early, calculate from current position\n fileHeight -\n (absoluteLineTop - fileTop) -\n // We gotta subtract the bottom padding off of the buffer\n paddingBottom;\n\n return {\n startingLine,\n totalLines: clampedTotalLines,\n bufferBefore,\n bufferAfter,\n };\n }\n}\n\ninterface HeightDeltaPrefix {\n lineIndexes: number[];\n prefixTotals: number[];\n}\n\nfunction createHeightDeltaPrefix(\n heightDeltas: Map<number, number>\n): HeightDeltaPrefix {\n const entries = Array.from(heightDeltas).sort((a, b) => a[0] - b[0]);\n const lineIndexes: number[] = [];\n const prefixTotals = [0];\n let total = 0;\n for (const [lineIndex, delta] of entries) {\n lineIndexes.push(lineIndex);\n total += delta;\n prefixTotals.push(total);\n }\n return { lineIndexes, prefixTotals };\n}\n\nfunction sumHeightDeltas(\n { lineIndexes, prefixTotals }: HeightDeltaPrefix,\n startLineIndex: number,\n endLineIndex: number\n): number {\n if (startLineIndex >= endLineIndex || lineIndexes.length === 0) {\n return 0;\n }\n const start = lowerBound(lineIndexes, startLineIndex);\n const end = lowerBound(lineIndexes, endLineIndex);\n return (prefixTotals[end] ?? 0) - (prefixTotals[start] ?? 0);\n}\n\nfunction lowerBound(values: number[], target: number): number {\n let low = 0;\n let high = values.length;\n while (low < high) {\n const mid = (low + high) >> 1;\n const value = values[mid];\n if (value == null) {\n throw new Error('VirtualizedFileDiff: invalid prefix index');\n }\n if (value < target) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return low;\n}\n\nfunction getNextCheckpointIndex(renderedLineIndex: number): number {\n return (\n Math.ceil(renderedLineIndex / LAYOUT_CHECKPOINT_INTERVAL) *\n LAYOUT_CHECKPOINT_INTERVAL\n );\n}\n\nfunction countMetadataOffsetsBefore(\n metadataOffsets: number[],\n offset: number\n): number {\n let count = 0;\n for (const metadataOffset of metadataOffsets) {\n if (metadataOffset < offset) {\n count++;\n }\n }\n return count;\n}\n\nfunction getHunkMetadataOffsets({\n diffStyle,\n hunk,\n rowCount,\n}: {\n diffStyle: 'split' | 'unified';\n hunk: Hunk;\n rowCount: number;\n}): number[] {\n if (rowCount <= 0 || (!hunk.noEOFCRAdditions && !hunk.noEOFCRDeletions)) {\n return [];\n }\n\n const lastContent = hunk.hunkContent.at(-1);\n if (lastContent == null) {\n return [];\n }\n\n if (lastContent.type === 'context') {\n return [rowCount - 1];\n }\n\n const splitCount = Math.max(lastContent.deletions, lastContent.additions);\n const unifiedCount = lastContent.deletions + lastContent.additions;\n if (diffStyle === 'split') {\n return splitCount > 0 && (hunk.noEOFCRAdditions || hunk.noEOFCRDeletions)\n ? [rowCount - 1]\n : [];\n }\n\n const offsets: number[] = [];\n const contentStartOffset = rowCount - unifiedCount;\n if (lastContent.deletions > 0 && hunk.noEOFCRDeletions) {\n offsets.push(contentStartOffset + lastContent.deletions - 1);\n }\n if (lastContent.additions > 0 && hunk.noEOFCRAdditions) {\n offsets.push(rowCount - 1);\n }\n return offsets;\n}\n\nfunction hasDiffLayoutOptionChanged<LAnnotation>(\n previousOptions: FileDiffOptions<LAnnotation>,\n nextOptions: FileDiffOptions<LAnnotation>\n): boolean {\n return (\n (previousOptions.diffStyle ?? 'split') !==\n (nextOptions.diffStyle ?? 'split') ||\n (previousOptions.overflow ?? 'scroll') !==\n (nextOptions.overflow ?? 'scroll') ||\n (previousOptions.collapsed ?? false) !== (nextOptions.collapsed ?? false) ||\n (previousOptions.disableLineNumbers ?? false) !==\n (nextOptions.disableLineNumbers ?? false) ||\n (previousOptions.disableFileHeader ?? false) !==\n (nextOptions.disableFileHeader ?? false) ||\n (previousOptions.diffIndicators ?? 'bars') !==\n (nextOptions.diffIndicators ?? 'bars') ||\n (previousOptions.hunkSeparators ?? 'line-info') !==\n (nextOptions.hunkSeparators ?? 'line-info') ||\n (previousOptions.expandUnchanged ?? false) !==\n (nextOptions.expandUnchanged ?? false) ||\n (previousOptions.collapsedContextThreshold ??\n DEFAULT_COLLAPSED_CONTEXT_THRESHOLD) !==\n (nextOptions.collapsedContextThreshold ??\n DEFAULT_COLLAPSED_CONTEXT_THRESHOLD) ||\n previousOptions.unsafeCSS !== nextOptions.unsafeCSS\n );\n}\n\nfunction hasDiffEstimateOptionChanged<LAnnotation>(\n previousOptions: FileDiffOptions<LAnnotation>,\n nextOptions: FileDiffOptions<LAnnotation>\n): boolean {\n return (\n (previousOptions.disableFileHeader ?? false) !==\n (nextOptions.disableFileHeader ?? false) ||\n (previousOptions.hunkSeparators ?? 'line-info') !==\n (nextOptions.hunkSeparators ?? 'line-info') ||\n (previousOptions.expandUnchanged ?? false) !==\n (nextOptions.expandUnchanged ?? false) ||\n (previousOptions.collapsedContextThreshold ??\n DEFAULT_COLLAPSED_CONTEXT_THRESHOLD) !==\n (nextOptions.collapsedContextThreshold ??\n DEFAULT_COLLAPSED_CONTEXT_THRESHOLD)\n );\n}\n\nfunction getOptionHunkSeparatorType<LAnnotation>(\n hunkSeparators: FileDiffOptions<LAnnotation>['hunkSeparators'] | undefined\n): HunkSeparators {\n return typeof hunkSeparators === 'function'\n ? 'custom'\n : (hunkSeparators ?? 'line-info');\n}\n\n// Extracts the view-specific line index from the data-line-index attribute.\n// Format is \"unifiedIndex,splitIndex\"\nfunction parseLineIndex(\n lineIndexAttr: string,\n diffStyle: 'split' | 'unified'\n): number {\n const [unifiedIndex, splitIndex] = lineIndexAttr.split(',').map(Number);\n return diffStyle === 'split' ? splitIndex : unifiedIndex;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VirtualizedFileDiff.js","names":[],"sources":["../../src/components/VirtualizedFileDiff.ts"],"sourcesContent":["import { DEFAULT_COLLAPSED_CONTEXT_THRESHOLD } from '../constants';\nimport type {\n DiffLineAnnotation,\n DiffsTextDocument,\n ExpansionDirections,\n FileDiffMetadata,\n Hunk,\n HunkSeparators,\n NumericScrollLineAnchor,\n PendingCodeViewLayoutReset,\n RenderRange,\n RenderWindow,\n SelectionSide,\n StickySpecs,\n ThemeTypes,\n VirtualFileMetrics,\n} from '../types';\nimport { areDiffTargetsEqual } from '../utils/areDiffTargetsEqual';\nimport { areObjectsEqual } from '../utils/areObjectsEqual';\nimport { areOptionsEqual } from '../utils/areOptionsEqual';\nimport { computeEstimatedDiffHeights } from '../utils/computeEstimatedDiffHeights';\nimport {\n computeVirtualFileMetrics,\n getVirtualFileHeaderRegion,\n getVirtualFilePaddingBottom,\n} from '../utils/computeVirtualFileMetrics';\nimport {\n FILE_ANNOTATION_DOM_KEY,\n FILE_ANNOTATION_LINE_NUMBER,\n includesFileAnnotations,\n shouldRenderFileAnnotations,\n} from '../utils/includesFileAnnotations';\nimport { iterateOverDiff } from '../utils/iterateOverDiff';\nimport { parseDiffFromFile } from '../utils/parseDiffFromFile';\nimport {\n getExpandedRegion,\n getLeadingHunkSeparatorLayout,\n getTrailingExpandedRegion,\n getTrailingHunkSeparatorLayout,\n} from '../utils/virtualDiffLayout';\nimport type { WorkerPoolManager } from '../worker';\nimport type { CodeView } from './CodeView';\nimport {\n FileDiff,\n type FileDiffOptions,\n type FileDiffRenderProps,\n} from './FileDiff';\nimport type { Virtualizer } from './Virtualizer';\n\ninterface DiffLayoutCheckpoint {\n renderedLineIndex: number;\n lineIndex: number;\n top: number;\n}\n\ninterface DiffLayoutCache {\n // Sparse map: view-specific line index -> measured height delta from the\n // baseline line height. Only stores lines that differ from the estimate.\n heightDeltas: Map<number, number>;\n // Aggregate delta from estimated height, including source row deltas and the\n // zero-baseline file annotation row height.\n measuredHeightDeltaTotal: number;\n // Baseline estimated heights for the active diff content. These are preserved\n // across style/collapse toggles and cleared only when estimate inputs change.\n estimatedSplitHeight: number | undefined;\n estimatedUnifiedHeight: number | undefined;\n // Sparse measured positions used to resume deep geometry scans near a target\n // diff line, rendered row, or scroll offset instead of replaying layout from\n // the first hunk.\n checkpoints: DiffLayoutCheckpoint[];\n // Total renderable diff rows for the current diff style and expansion state.\n totalLines: number;\n // Measured height for the file annotation row. Starts at 0 so\n // unmeasured annotations behave like all other unmeasured annotations.\n fileAnnotationHeight: number;\n}\n\ninterface ResetLayoutCacheOptions {\n forceSimpleRecompute?: boolean;\n includeEstimatedHeights?: boolean;\n}\n\nconst LAYOUT_CHECKPOINT_INTERVAL = 5_000;\n\nlet instanceId = -1;\n\nexport class VirtualizedFileDiff<\n LAnnotation = undefined,\n> extends FileDiff<LAnnotation> {\n override readonly __id: string = `little-virtualized-file-diff:${++instanceId}`;\n\n public top: number | undefined;\n public height: number = 0;\n private metrics: VirtualFileMetrics;\n private cache: DiffLayoutCache = {\n heightDeltas: new Map(),\n measuredHeightDeltaTotal: 0,\n estimatedSplitHeight: undefined,\n estimatedUnifiedHeight: undefined,\n checkpoints: [],\n totalLines: 0,\n fileAnnotationHeight: 0,\n };\n private isVisible: boolean = false;\n private isSetup: boolean = false;\n private virtualizer: Virtualizer | CodeView<LAnnotation>;\n private layoutDirty = true;\n private forceRenderOverride: true | undefined;\n private currentCollapsed: boolean | undefined;\n\n constructor(\n options: FileDiffOptions<LAnnotation> | undefined,\n virtualizer: Virtualizer | CodeView<LAnnotation>,\n metrics?: Partial<VirtualFileMetrics>,\n workerManager?: WorkerPoolManager,\n isContainerManaged = false\n ) {\n super(options, workerManager, isContainerManaged);\n this.virtualizer = virtualizer;\n this.metrics = computeVirtualFileMetrics(metrics);\n }\n\n public setMetrics(\n metrics?: Partial<VirtualFileMetrics>,\n force = false\n ): void {\n const nextMetrics = computeVirtualFileMetrics(metrics);\n if (!force && areObjectsEqual(this.metrics, nextMetrics)) {\n return;\n }\n\n this.metrics = nextMetrics;\n this.resetLayoutCache({ includeEstimatedHeights: true });\n }\n\n override setLineAnnotations(\n lineAnnotations: DiffLineAnnotation<LAnnotation>[]\n ): void {\n if (this.syncLineAnnotations(lineAnnotations)) {\n this.resetLayoutCache({ includeEstimatedHeights: false });\n }\n }\n\n private syncLineAnnotations(\n lineAnnotations: DiffLineAnnotation<LAnnotation>[] | undefined\n ): boolean {\n if (\n lineAnnotations == null ||\n lineAnnotations === this.lineAnnotations ||\n (lineAnnotations.length === 0 && this.lineAnnotations.length === 0)\n ) {\n return false;\n }\n super.setLineAnnotations(lineAnnotations);\n return true;\n }\n\n private setFileAnnotationHeight(nextHeight: number): boolean {\n const previousHeight = this.cache.fileAnnotationHeight;\n if (nextHeight === previousHeight) {\n return false;\n }\n\n this.cache.fileAnnotationHeight = nextHeight;\n this.cache.measuredHeightDeltaTotal += nextHeight - previousHeight;\n return true;\n }\n\n private hasFileAnnotations(\n fileDiff: FileDiffMetadata | undefined = this.fileDiff\n ): boolean {\n if (fileDiff == null || !includesFileAnnotations(this.lineAnnotations)) {\n return false;\n }\n return this.lineAnnotations.some((annotation) => {\n if (annotation.lineNumber !== FILE_ANNOTATION_LINE_NUMBER) {\n return false;\n }\n // Lets ensure for singled sided diffs that the sides match\n if (fileDiff.type === 'new') {\n return annotation.side === 'additions';\n }\n if (fileDiff.type === 'deleted') {\n return annotation.side === 'deletions';\n }\n return true;\n });\n }\n\n // Get the height for a line, using cached value if available.\n // If not cached and hasMetadataLine is true, adds lineHeight for the metadata.\n private getLineHeight(lineIndex: number, hasMetadataLine = false): number {\n return (\n this.getEstimatedLineHeight(hasMetadataLine) +\n (this.cache.heightDeltas.get(lineIndex) ?? 0)\n );\n }\n\n private getEstimatedLineHeight(hasMetadataLine = false): number {\n const multiplier = hasMetadataLine ? 2 : 1;\n return this.metrics.lineHeight * multiplier;\n }\n\n override setOptions(options: FileDiffOptions<LAnnotation> | undefined): void {\n if (this.isAdvancedMode()) {\n throw new Error(\n 'VirtualizedFileDiff.setOptions cannot be used inside CodeView. Update CodeView options instead.'\n );\n }\n\n if (options == null) return;\n const { options: previousOptions } = this;\n const optionsChanged = !areOptionsEqual(previousOptions, options);\n const layoutChanged =\n optionsChanged && hasDiffLayoutOptionChanged(previousOptions, options);\n\n super.setOptions(options);\n\n if (layoutChanged) {\n this.resetLayoutCache({\n forceSimpleRecompute: true,\n includeEstimatedHeights: hasDiffEstimateOptionChanged(\n previousOptions,\n options\n ),\n });\n }\n // Any option can affect rendered DOM; only layout-affecting options clear\n // the measured height cache above.\n if (optionsChanged) {\n this.forceRenderOverride = true;\n }\n if (optionsChanged && this.isSimpleMode()) {\n this.virtualizer.instanceChanged(this, layoutChanged);\n }\n }\n\n override setThemeType(themeType: ThemeTypes): void {\n if (this.isAdvancedMode()) {\n throw new Error(\n 'VirtualizedFileDiff.setThemeType cannot be used inside CodeView. Update CodeView options instead.'\n );\n }\n\n super.setThemeType(themeType);\n }\n\n private resetLayoutCache({\n forceSimpleRecompute = false,\n includeEstimatedHeights = false,\n }: ResetLayoutCacheOptions = {}): void {\n this.layoutDirty = true;\n this.cache.fileAnnotationHeight = 0;\n if (this.cache.heightDeltas.size > 0) {\n this.cache.heightDeltas.clear();\n }\n if (this.cache.measuredHeightDeltaTotal !== 0) {\n this.cache.measuredHeightDeltaTotal = 0;\n }\n if (this.cache.checkpoints.length > 0) {\n this.cache.checkpoints.length = 0;\n }\n if (this.cache.totalLines !== 0) {\n this.cache.totalLines = 0;\n }\n if (includeEstimatedHeights) {\n this.cache.estimatedSplitHeight = undefined;\n this.cache.estimatedUnifiedHeight = undefined;\n }\n if (this.renderRange != null) {\n this.renderRange = undefined;\n }\n // NOTE(amadeus): In CodeView we intentionally batch computes to all happen\n // at the same time, so we shouldn't trigger this there.\n if (forceSimpleRecompute && this.isSimpleMode()) {\n this.computeApproximateSize();\n }\n }\n\n // Measure rendered lines and update height cache.\n // Called after render to reconcile estimated vs actual heights.\n // Definitely need to optimize this in cases where there aren't any custom\n // line heights or in cases of extremely large files...\n public reconcileHeights(): boolean {\n let hasHeightChange = false;\n const { overflow = 'scroll' } = this.options;\n if (this.fileContainer == null || this.fileDiff == null) {\n if (this.height !== 0) {\n hasHeightChange = true;\n }\n this.height = 0;\n return hasHeightChange;\n }\n this.top = this.getVirtualizedTop();\n // NOTE(amadeus): We can probably be a lot smarter about this, and we\n // should be thinking about ways to improve this\n // If the file has no annotations and we are using the scroll variant, then\n // we can probably skip everything\n if (\n overflow === 'scroll' &&\n this.lineAnnotations.length === 0 &&\n !this.isResizeDebuggingEnabled()\n ) {\n return hasHeightChange;\n }\n const diffStyle = this.getDiffStyle();\n const codeGroups =\n diffStyle === 'split'\n ? [this.codeDeletions, this.codeAdditions]\n : [this.codeUnified];\n\n const hasFileAnnotations = this.hasFileAnnotations(this.fileDiff);\n if (\n this.renderRange != null &&\n hasFileAnnotations &&\n shouldRenderFileAnnotations(this.renderRange)\n ) {\n const fileAnnotationHeight = measureFileAnnotationHeight(codeGroups);\n const nextFileAnnotationHeight = fileAnnotationHeight ?? 0;\n if (this.setFileAnnotationHeight(nextFileAnnotationHeight)) {\n hasHeightChange = true;\n }\n } else if (!hasFileAnnotations && this.setFileAnnotationHeight(0)) {\n hasHeightChange = true;\n }\n\n for (const codeGroup of codeGroups) {\n if (codeGroup == null) continue;\n const content = codeGroup.children[1];\n if (!(content instanceof HTMLElement)) continue;\n for (const line of content.children) {\n if (!(line instanceof HTMLElement)) continue;\n\n const lineIndexAttr = line.dataset.lineIndex;\n if (lineIndexAttr == null) continue;\n\n const lineIndex = parseLineIndex(lineIndexAttr, diffStyle);\n let measuredHeight = line.getBoundingClientRect().height;\n let hasMetadata = false;\n // Annotations or noNewline metadata increase the size of the their\n // attached line\n if (\n line.nextElementSibling instanceof HTMLElement &&\n ('lineAnnotation' in line.nextElementSibling.dataset ||\n 'noNewline' in line.nextElementSibling.dataset)\n ) {\n if ('noNewline' in line.nextElementSibling.dataset) {\n hasMetadata = true;\n }\n measuredHeight +=\n line.nextElementSibling.getBoundingClientRect().height;\n }\n const estimatedHeight = this.getEstimatedLineHeight(hasMetadata);\n const previousDelta = this.cache.heightDeltas.get(lineIndex) ?? 0;\n const nextDelta = measuredHeight - estimatedHeight;\n\n if (nextDelta === previousDelta) {\n continue;\n }\n\n hasHeightChange = true;\n this.cache.measuredHeightDeltaTotal += nextDelta - previousDelta;\n if (nextDelta === 0) {\n this.cache.heightDeltas.delete(lineIndex);\n } else {\n this.cache.heightDeltas.set(lineIndex, nextDelta);\n }\n }\n }\n\n if (hasHeightChange || this.isResizeDebuggingEnabled()) {\n this.computeApproximateSize(true);\n }\n return hasHeightChange;\n }\n\n public onRender = (dirty: boolean): boolean => {\n if (this.fileContainer == null) {\n return false;\n }\n if (dirty) {\n this.top = this.getVirtualizedTop();\n }\n return this.render();\n };\n\n // Prepares this item for CodeView layout by binding the latest diff, syncing\n // its virtualized top, and returning an approximate height. This method is\n // called while downstream items are being re-positioned, so later changes\n // should keep clean instances on a cached-height fast path.\n public prepareCodeViewItem(\n fileDiff: FileDiffMetadata,\n top: number,\n reset?: PendingCodeViewLayoutReset,\n lineAnnotations?: DiffLineAnnotation<LAnnotation>[]\n ): number {\n const targetChanged = !areDiffTargetsEqual(this.fileDiff, fileDiff);\n const annotationsChanged = this.syncLineAnnotations(lineAnnotations);\n let shouldResetLayoutCache =\n reset?.resetDiffLayoutCache === true ||\n targetChanged ||\n annotationsChanged;\n let includeEstimatedHeights =\n targetChanged ||\n (reset?.resetDiffLayoutCache === true &&\n reset.includeEstimatedDiffHeights);\n\n if (reset?.metrics != null) {\n this.metrics = computeVirtualFileMetrics(reset.metrics);\n shouldResetLayoutCache = true;\n includeEstimatedHeights = true;\n }\n\n const { collapsed = false } = this.options;\n if (this.currentCollapsed !== collapsed) {\n this.currentCollapsed = collapsed;\n shouldResetLayoutCache = true;\n }\n\n if (shouldResetLayoutCache) {\n this.resetLayoutCache({ includeEstimatedHeights });\n }\n this.fileDiff = fileDiff;\n this.top = top;\n this.computeApproximateSize();\n return this.height;\n }\n\n public getLinePosition(\n lineNumber: number,\n side: SelectionSide = 'additions'\n ): { top: number; height: number } | undefined {\n if (this.fileDiff == null || lineNumber < 1) {\n return undefined;\n }\n\n const targetLineIndexes = this.getLineIndex(lineNumber, side);\n if (targetLineIndexes == null) {\n return undefined;\n }\n\n const {\n disableFileHeader = false,\n expandUnchanged = false,\n collapsed = false,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n } = this.options;\n const diffStyle = this.getDiffStyle();\n const hunkSeparators = this.getHunkSeparatorType();\n const targetLineIndex =\n diffStyle === 'split' ? targetLineIndexes[1] : targetLineIndexes[0];\n this.approximateLayoutCheckpoints();\n const headerRegion = getVirtualFileHeaderRegion(\n this.metrics,\n disableFileHeader\n );\n const checkpoint = this.getLayoutCheckpointBeforeLineIndex(targetLineIndex);\n let top = checkpoint?.top ?? headerRegion + this.cache.fileAnnotationHeight;\n\n if (collapsed) {\n return { top: headerRegion, height: 0 };\n }\n\n let position: { top: number; height: number } | undefined;\n iterateOverDiff({\n diff: this.fileDiff,\n diffStyle,\n startingLine: checkpoint?.renderedLineIndex ?? 0,\n expandedHunks: expandUnchanged\n ? true\n : this.hunksRenderer.getExpandedHunksMap(),\n collapsedContextThreshold,\n callback: ({\n hunkIndex,\n hunk,\n collapsedBefore,\n collapsedAfter,\n deletionLine,\n additionLine,\n }) => {\n const lineIndex =\n diffStyle === 'split'\n ? (additionLine?.splitLineIndex ?? deletionLine?.splitLineIndex)\n : (additionLine?.unifiedLineIndex ??\n deletionLine?.unifiedLineIndex);\n if (lineIndex == null) {\n throw new Error(\n 'VirtualizedFileDiff.getLinePosition: missing line index data'\n );\n }\n\n if (collapsedBefore > 0) {\n const separator = getLeadingHunkSeparatorLayout({\n type: hunkSeparators,\n metrics: this.metrics,\n hunkIndex,\n hunkSpecs: hunk?.hunkSpecs,\n });\n if (separator != null) {\n top += separator.gapBefore;\n if (\n targetLineIndex >= lineIndex - collapsedBefore &&\n targetLineIndex < lineIndex\n ) {\n position = {\n top,\n height: separator.height,\n };\n return true;\n }\n top += separator.height + separator.gapAfter;\n }\n }\n\n const lineHeight = this.getLineHeight(\n lineIndex,\n (additionLine?.noEOFCR ?? false) || (deletionLine?.noEOFCR ?? false)\n );\n if (lineIndex === targetLineIndex) {\n position = {\n top,\n height: lineHeight,\n };\n return true;\n }\n top += lineHeight;\n\n if (collapsedAfter > 0) {\n const separator = getTrailingHunkSeparatorLayout({\n type: hunkSeparators,\n metrics: this.metrics,\n });\n if (separator != null) {\n if (\n targetLineIndex > lineIndex &&\n targetLineIndex <= lineIndex + collapsedAfter\n ) {\n position = {\n top: top + separator.gapBefore,\n height: separator.height,\n };\n return true;\n }\n top += separator.totalHeight;\n }\n }\n\n return false;\n },\n });\n\n return position;\n }\n\n public getNumericScrollAnchor(\n localViewportTop: number\n ): NumericScrollLineAnchor | undefined {\n if (this.fileDiff == null) {\n return undefined;\n }\n\n const {\n disableFileHeader = false,\n expandUnchanged = false,\n collapsed = false,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n } = this.options;\n if (collapsed) {\n return undefined;\n }\n\n const diffStyle = this.getDiffStyle();\n const hunkSeparators = this.getHunkSeparatorType();\n\n this.approximateLayoutCheckpoints();\n const checkpoint = this.getLayoutCheckpointBeforeTop(localViewportTop);\n let top =\n checkpoint?.top ??\n getVirtualFileHeaderRegion(this.metrics, disableFileHeader) +\n this.cache.fileAnnotationHeight;\n let anchor: NumericScrollLineAnchor | undefined;\n\n // This may end up being quite expensive on extremely large files, we may\n // need to figure out how to anchor on different regions, or utilize\n // renderRange to shortcut this for us somehow\n iterateOverDiff({\n diff: this.fileDiff,\n diffStyle,\n startingLine: checkpoint?.renderedLineIndex ?? 0,\n expandedHunks: expandUnchanged\n ? true\n : this.hunksRenderer.getExpandedHunksMap(),\n collapsedContextThreshold,\n callback: ({\n hunkIndex,\n hunk,\n collapsedBefore,\n collapsedAfter,\n deletionLine,\n additionLine,\n }) => {\n const lineIndex =\n diffStyle === 'split'\n ? (additionLine?.splitLineIndex ?? deletionLine?.splitLineIndex)\n : (additionLine?.unifiedLineIndex ??\n deletionLine?.unifiedLineIndex);\n if (lineIndex == null) {\n throw new Error(\n 'VirtualizedFileDiff.getNumericScrollAnchor: missing line index data'\n );\n }\n\n if (collapsedBefore > 0) {\n const separator = getLeadingHunkSeparatorLayout({\n type: hunkSeparators,\n metrics: this.metrics,\n hunkIndex,\n hunkSpecs: hunk?.hunkSpecs,\n });\n if (separator != null) {\n top += separator.totalHeight;\n }\n }\n\n if (top >= localViewportTop) {\n if (deletionLine != null) {\n anchor = {\n lineNumber: deletionLine.lineNumber,\n side: 'deletions',\n top,\n };\n } else if (additionLine != null) {\n anchor = {\n lineNumber: additionLine.lineNumber,\n side: 'additions',\n top,\n };\n }\n if (anchor != null) {\n return true;\n }\n }\n\n const lineHeight = this.getLineHeight(\n lineIndex,\n (additionLine?.noEOFCR ?? false) || (deletionLine?.noEOFCR ?? false)\n );\n top += lineHeight;\n\n if (collapsedAfter > 0) {\n const separator = getTrailingHunkSeparatorLayout({\n type: hunkSeparators,\n metrics: this.metrics,\n });\n if (separator != null) {\n top += separator.totalHeight;\n }\n }\n\n return false;\n },\n });\n\n return anchor;\n }\n\n public getVirtualizedHeight(): number {\n return this.height;\n }\n\n public getAdvancedStickySpecs(\n windowSpecs?: RenderWindow\n ): StickySpecs | undefined {\n if (this.top == null || this.fileDiff == null) {\n return undefined;\n }\n if (this.options.collapsed === true) {\n return { topOffset: this.top, height: this.height };\n }\n const renderRange =\n windowSpecs != null\n ? this.computeRenderRangeFromWindow(\n this.fileDiff,\n this.top,\n windowSpecs\n )\n : this.renderRange;\n if (renderRange == null) {\n return undefined;\n }\n const { bufferBefore, bufferAfter, totalLines } = renderRange;\n // Rendered items flow contiguously in the sticky container with no buffer\n // spacers, so a header-only item (totalLines === 0, none of its rows fall\n // inside the window) must report where its header actually sits in that\n // flow, which depends on which side of the window its content is on:\n // - content ABOVE the window (item starts above window.top): the header\n // sits at the item's bottom so the following item connects, so offset by\n // bufferAfter.\n // - content BELOW the window (item starts at/after window.top, e.g. a\n // trailing header peeking in at the bottom): the header renders at the\n // item's top with nothing after it, so no offset. Always adding\n // bufferAfter here made getStickyBounds over-measure the sticky\n // container for that trailing case.\n let headerOnlyOffset = 0;\n if (totalLines === 0) {\n const activeWindow = windowSpecs ?? this.virtualizer.getWindowSpecs();\n if (this.top < activeWindow.top) {\n headerOnlyOffset = bufferAfter;\n }\n }\n return {\n topOffset: this.top + bufferBefore + headerOnlyOffset,\n height: this.height - (bufferBefore + bufferAfter),\n };\n }\n\n override cleanUp(recycle = false): void {\n if (this.fileContainer != null && this.isSimpleMode()) {\n this.getSimpleVirtualizer()?.disconnect(this.fileContainer);\n }\n if (!recycle) {\n this.resetLayoutCache({ includeEstimatedHeights: true });\n }\n this.isSetup = false;\n super.cleanUp(recycle);\n }\n\n override expandHunk = (\n hunkIndex: number,\n direction: ExpansionDirections,\n expansionLineCountOverride?: number\n ): void => {\n this.hunksRenderer.expandHunk(\n hunkIndex,\n direction,\n expansionLineCountOverride\n );\n this.forceRenderOverride = true;\n this.resetLayoutCache({ includeEstimatedHeights: true });\n if (this.isSimpleMode()) {\n this.computeApproximateSize();\n }\n this.virtualizer.instanceChanged(this, true);\n };\n\n public setVisibility(visible: boolean): void {\n if (this.isAdvancedMode() || this.fileContainer == null) {\n return;\n }\n this.renderRange = undefined;\n if (visible && !this.isVisible) {\n this.top = this.getVirtualizedTop();\n this.isVisible = true;\n } else if (!visible && this.isVisible) {\n this.isVisible = false;\n this.rerender();\n }\n }\n\n override rerender(): void {\n if (\n !this.enabled ||\n (this.fileDiff == null &&\n this.additionFile == null &&\n this.deletionFile == null)\n ) {\n return;\n }\n this.forceRenderOverride = true;\n this.virtualizer.instanceChanged(this, false);\n }\n\n // Normally triggered by the editor when the document line count changes.\n override applyDocumentChange(\n textDocument: DiffsTextDocument,\n newLineAnnotations?: DiffLineAnnotation<LAnnotation>[],\n shouldUpdateBuffer = false\n ): void {\n const previousRenderRange = this.renderRange;\n\n super.applyDocumentChange(textDocument, newLineAnnotations);\n\n this.getSimpleVirtualizer()?.markDOMDirty();\n this.resetLayoutCache({\n forceSimpleRecompute: this.isSimpleMode(),\n includeEstimatedHeights: true,\n });\n\n // Update the buffers caused by the line-count change to ensure the editor\n // scrolls to the correct position before re-rendering\n if (\n shouldUpdateBuffer &&\n previousRenderRange !== undefined &&\n this.fileDiff !== undefined\n ) {\n const windowSpecs = this.virtualizer.getWindowSpecs();\n const renderRange = this.computeRenderRangeFromWindow(\n this.fileDiff,\n this.top ?? 0,\n windowSpecs\n );\n if (renderRange.bufferAfter !== previousRenderRange.bufferAfter) {\n this.updateBuffers(renderRange);\n }\n }\n }\n\n // Compute the approximate size from the cached baseline estimate plus any\n // measured height deltas observed in rendered rows.\n // The reason we refer to this as `approximate size` is because heights my\n // dynamically change for a number of reasons so we can never be fully sure\n // if the height is 100% accurate\n private computeApproximateSize(force = false): void {\n const shouldValidateSize = this.isResizeDebuggingEnabled();\n if (!force && !this.layoutDirty && !shouldValidateSize) {\n return;\n }\n\n const isFirstCompute = this.height === 0;\n this.height = 0;\n this.cache.checkpoints = [];\n this.cache.totalLines = 0;\n if (this.fileDiff == null) {\n this.layoutDirty = false;\n return;\n }\n\n const { disableFileHeader = false, collapsed = false } = this.options;\n const headerRegion = getVirtualFileHeaderRegion(\n this.metrics,\n disableFileHeader\n );\n\n this.height += headerRegion;\n if (collapsed) {\n this.layoutDirty = false;\n return;\n }\n\n this.height =\n this.getActiveEstimatedHeight() + this.cache.measuredHeightDeltaTotal;\n\n if (shouldValidateSize && !isFirstCompute) {\n this.validateComputedHeight();\n }\n this.layoutDirty = false;\n }\n\n private getActiveEstimatedHeight(): number {\n this.ensureEstimatedDiffHeights();\n const estimatedHeight =\n this.getDiffStyle() === 'split'\n ? this.cache.estimatedSplitHeight\n : this.cache.estimatedUnifiedHeight;\n if (estimatedHeight == null) {\n throw new Error(\n 'VirtualizedFileDiff.getActiveEstimatedHeight: missing estimated height'\n );\n }\n return estimatedHeight;\n }\n\n private ensureEstimatedDiffHeights(): void {\n if (this.fileDiff == null) {\n this.cache.estimatedSplitHeight = undefined;\n this.cache.estimatedUnifiedHeight = undefined;\n return;\n }\n if (\n this.cache.estimatedSplitHeight != null &&\n this.cache.estimatedUnifiedHeight != null\n ) {\n return;\n }\n\n const {\n disableFileHeader = false,\n expandUnchanged = false,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n } = this.options;\n const { splitHeight, unifiedHeight } = computeEstimatedDiffHeights({\n fileDiff: this.fileDiff,\n metrics: this.metrics,\n disableFileHeader,\n hunkSeparators: this.getHunkSeparatorType(),\n expandUnchanged,\n expandedHunks: this.hunksRenderer.getExpandedHunksMap(),\n collapsedContextThreshold,\n });\n this.cache.estimatedSplitHeight = splitHeight;\n this.cache.estimatedUnifiedHeight = unifiedHeight;\n }\n\n private validateComputedHeight(): void {\n if (this.fileContainer == null || this.fileDiff == null) {\n return;\n }\n\n const rect = this.fileContainer.getBoundingClientRect();\n if (rect.height !== this.height) {\n console.log(\n 'VirtualizedFileDiff.computeApproximateSize: computed height doesnt match',\n {\n name: this.fileDiff.name,\n elementHeight: rect.height,\n computedHeight: this.height,\n }\n );\n } else {\n console.log(\n 'VirtualizedFileDiff.computeApproximateSize: computed height IS CORRECT'\n );\n }\n }\n\n override render({\n fileContainer,\n oldFile,\n newFile,\n fileDiff,\n forceRender = false,\n lineAnnotations,\n ...props\n }: FileDiffRenderProps<LAnnotation> = {}): boolean {\n const { forceRenderOverride, isSetup } = this;\n this.forceRenderOverride = undefined;\n const annotationsChanged = this.syncLineAnnotations(lineAnnotations);\n if (annotationsChanged) {\n this.resetLayoutCache({ includeEstimatedHeights: false });\n }\n\n this.fileDiff ??=\n fileDiff ??\n (oldFile != null && newFile != null\n ? // NOTE(amadeus): We might be forcing ourselves to double up the\n // computation of fileDiff (in the super.render() call), so we might want\n // to figure out a way to avoid that. That also could be just as simple as\n // passing through fileDiff though... so maybe we good?\n parseDiffFromFile(oldFile, newFile, this.options.parseDiffOptions)\n : undefined);\n\n fileContainer = this.getOrCreateFileContainer(fileContainer);\n\n if (this.fileDiff == null) {\n console.error(\n 'VirtualizedFileDiff.render: attempting to virtually render when we dont have the correct data'\n );\n return false;\n }\n\n if (!isSetup) {\n this.computeApproximateSize();\n const virtualizer = this.getSimpleVirtualizer();\n this.top ??= this.getVirtualizedTop();\n if (this.isAdvancedMode()) {\n this.isVisible = true;\n } else {\n if (virtualizer == null) {\n throw new Error(\n 'VirtualizedFileDiff.render: simple virtualizer is not available'\n );\n }\n virtualizer.connect(fileContainer, this);\n this.isVisible = virtualizer.isInstanceVisible(\n this.top ?? 0,\n this.height\n );\n }\n this.isSetup = true;\n } else {\n this.top ??= this.getVirtualizedTop();\n }\n\n if (!this.isVisible && this.isSimpleMode()) {\n return this.renderPlaceholder(this.height);\n }\n\n const windowSpecs = this.virtualizer.getWindowSpecs();\n const fileTop = this.top ?? 0;\n const renderRange = this.computeRenderRangeFromWindow(\n this.fileDiff,\n fileTop,\n windowSpecs\n );\n return super.render({\n fileDiff: this.fileDiff,\n fileContainer,\n renderRange,\n oldFile,\n newFile,\n lineAnnotations,\n forceRender: (forceRenderOverride ?? forceRender) || annotationsChanged,\n ...props,\n });\n }\n\n public syncVirtualizedTop(): void {\n this.top = this.getVirtualizedTop();\n }\n\n protected override shouldDisableVirtualizationBuffers(): boolean {\n return this.isAdvancedMode() || super.shouldDisableVirtualizationBuffers();\n }\n\n private isSimpleMode(): boolean {\n return this.virtualizer.type === 'simple';\n }\n\n private isAdvancedMode(): boolean {\n return this.virtualizer.type === 'advanced';\n }\n\n private getVirtualizedTop(): number | undefined {\n if (this.virtualizer.type === 'advanced') {\n return this.virtualizer.getLocalTopForInstance(this);\n }\n return this.fileContainer != null\n ? this.virtualizer.getOffsetInScrollContainer(this.fileContainer)\n : 0;\n }\n\n private getSimpleVirtualizer(): Virtualizer | undefined {\n return this.virtualizer.type === 'simple' ? this.virtualizer : undefined;\n }\n\n private isResizeDebuggingEnabled(): boolean {\n return this.getSimpleVirtualizer()?.config.resizeDebugging ?? false;\n }\n\n private getDiffStyle(): 'split' | 'unified' {\n return this.options.diffStyle ?? 'split';\n }\n\n private getHunkSeparatorType(): HunkSeparators {\n return getOptionHunkSeparatorType(this.options.hunkSeparators);\n }\n\n private approximateLayoutCheckpoints(): void {\n if (\n this.cache.checkpoints.length > 0 ||\n this.fileDiff == null ||\n this.fileDiff.hunks.length === 0 ||\n this.options.collapsed === true\n ) {\n return;\n }\n\n const {\n disableFileHeader = false,\n expandUnchanged = false,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n } = this.options;\n const finalHunkIndex = this.fileDiff.hunks.length - 1;\n const diffStyle = this.getDiffStyle();\n const hunkSeparators = this.getHunkSeparatorType();\n const expandedHunks = expandUnchanged\n ? true\n : this.hunksRenderer.getExpandedHunksMap();\n const heightDeltaPrefix = createHeightDeltaPrefix(this.cache.heightDeltas);\n let top =\n getVirtualFileHeaderRegion(this.metrics, disableFileHeader) +\n this.cache.fileAnnotationHeight;\n let renderedLineIndex = 0;\n\n const processRows = ({\n rowCount,\n startLineIndex,\n preSeparatorHeight = 0,\n postSeparatorHeight = 0,\n metadataOffsets = [],\n }: {\n rowCount: number;\n startLineIndex: number;\n preSeparatorHeight?: number;\n postSeparatorHeight?: number;\n metadataOffsets?: number[];\n }) => {\n if (rowCount <= 0) {\n return;\n }\n\n const blockStart = renderedLineIndex;\n const blockEnd = renderedLineIndex + rowCount;\n let nextCheckpoint = getNextCheckpointIndex(blockStart);\n while (nextCheckpoint < blockEnd) {\n const offset = nextCheckpoint - blockStart;\n const checkpointTop =\n top +\n (offset > 0 ? preSeparatorHeight : 0) +\n offset * this.metrics.lineHeight +\n countMetadataOffsetsBefore(metadataOffsets, offset) *\n this.metrics.lineHeight +\n sumHeightDeltas(\n heightDeltaPrefix,\n startLineIndex,\n startLineIndex + offset\n );\n this.cache.checkpoints.push({\n renderedLineIndex: nextCheckpoint,\n lineIndex: startLineIndex + offset,\n top: checkpointTop,\n });\n nextCheckpoint += LAYOUT_CHECKPOINT_INTERVAL;\n }\n\n top +=\n preSeparatorHeight +\n rowCount * this.metrics.lineHeight +\n metadataOffsets.length * this.metrics.lineHeight +\n sumHeightDeltas(\n heightDeltaPrefix,\n startLineIndex,\n startLineIndex + rowCount\n ) +\n postSeparatorHeight;\n renderedLineIndex = blockEnd;\n };\n\n for (\n let hunkIndex = 0;\n hunkIndex < this.fileDiff.hunks.length;\n hunkIndex++\n ) {\n const hunk = this.fileDiff.hunks[hunkIndex];\n if (hunk == null) {\n throw new Error(\n 'VirtualizedFileDiff.approximateLayoutCheckpoints: invalid hunk index'\n );\n }\n\n const leadingRegion = getExpandedRegion({\n isPartial: this.fileDiff.isPartial,\n rangeSize: hunk.collapsedBefore,\n expandedHunks,\n hunkIndex,\n collapsedContextThreshold,\n });\n const leadingSeparatorHeight =\n leadingRegion.collapsedLines > 0\n ? (getLeadingHunkSeparatorLayout({\n type: hunkSeparators,\n metrics: this.metrics,\n hunkIndex,\n hunkSpecs: hunk.hunkSpecs,\n })?.totalHeight ?? 0)\n : 0;\n\n processRows({\n rowCount: leadingRegion.fromStart,\n startLineIndex:\n (diffStyle === 'split'\n ? hunk.splitLineStart\n : hunk.unifiedLineStart) - leadingRegion.rangeSize,\n });\n\n let pendingLeadingSeparatorHeight = leadingSeparatorHeight;\n processRows({\n rowCount: leadingRegion.fromEnd,\n startLineIndex:\n (diffStyle === 'split'\n ? hunk.splitLineStart\n : hunk.unifiedLineStart) - leadingRegion.fromEnd,\n preSeparatorHeight: pendingLeadingSeparatorHeight,\n });\n if (leadingRegion.fromEnd > 0) {\n pendingLeadingSeparatorHeight = 0;\n }\n\n const trailingRegion =\n hunkIndex === finalHunkIndex\n ? getTrailingExpandedRegion({\n fileDiff: this.fileDiff,\n hunkIndex,\n expandedHunks,\n collapsedContextThreshold,\n errorPrefix: 'VirtualizedFileDiff',\n })\n : undefined;\n const trailingSeparatorHeight =\n trailingRegion != null && trailingRegion.collapsedLines > 0\n ? (getTrailingHunkSeparatorLayout({\n type: hunkSeparators,\n metrics: this.metrics,\n })?.totalHeight ?? 0)\n : 0;\n const trailingExpandedCount =\n trailingRegion != null\n ? trailingRegion.fromStart + trailingRegion.fromEnd\n : 0;\n\n const hunkBodyRowCount =\n diffStyle === 'split' ? hunk.splitLineCount : hunk.unifiedLineCount;\n const hunkBodyStartLineIndex =\n diffStyle === 'split' ? hunk.splitLineStart : hunk.unifiedLineStart;\n processRows({\n rowCount: hunkBodyRowCount,\n startLineIndex: hunkBodyStartLineIndex,\n preSeparatorHeight: pendingLeadingSeparatorHeight,\n postSeparatorHeight:\n trailingExpandedCount === 0 ? trailingSeparatorHeight : 0,\n metadataOffsets: getHunkMetadataOffsets({\n diffStyle,\n hunk,\n rowCount: hunkBodyRowCount,\n }),\n });\n\n if (trailingRegion != null && trailingExpandedCount > 0) {\n processRows({\n rowCount: trailingExpandedCount,\n startLineIndex: hunkBodyStartLineIndex + hunkBodyRowCount,\n postSeparatorHeight: trailingSeparatorHeight,\n });\n }\n }\n\n this.cache.totalLines = renderedLineIndex;\n }\n\n // Find the nearest sparse layout checkpoint at or before an active\n // diff-style line index. Diff checkpoints also store the dense rendered-row\n // index, so deep line-position lookups can resume iteration from that\n // rendered row and replay only the nearby layout work instead of walking\n // from the first hunk.\n private getLayoutCheckpointBeforeLineIndex(\n lineIndex: number\n ): DiffLayoutCheckpoint | undefined {\n if (lineIndex <= 0 || this.cache.checkpoints.length === 0) {\n return undefined;\n }\n\n let low = 0;\n let high = this.cache.checkpoints.length - 1;\n let result: DiffLayoutCheckpoint | undefined;\n\n while (low <= high) {\n const mid = (low + high) >> 1;\n const checkpoint = this.cache.checkpoints[mid];\n if (checkpoint == null) {\n throw new Error('VirtualizedFileDiff: invalid checkpoint index');\n }\n if (checkpoint.lineIndex <= lineIndex) {\n result = checkpoint;\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n\n return result;\n }\n\n // Find the nearest sparse layout checkpoint at or before a scroll offset.\n // Render-range scans start from this checkpoint so variable-height diffs\n // only replay nearby rows. When `hunkLineCount` is provided, step backward\n // to a rendered hunk boundary so buffer calculations can reuse absolute hunk\n // offsets safely.\n private getLayoutCheckpointBeforeTop(\n top: number,\n hunkLineCount?: number\n ): DiffLayoutCheckpoint | undefined {\n let low = 0;\n let high = this.cache.checkpoints.length - 1;\n let resultIndex = -1;\n\n while (low <= high) {\n const mid = (low + high) >> 1;\n const checkpoint = this.cache.checkpoints[mid];\n if (checkpoint == null) {\n throw new Error('VirtualizedFileDiff: invalid checkpoint index');\n }\n if (checkpoint.top <= top) {\n resultIndex = mid;\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n\n if (hunkLineCount == null) {\n return resultIndex >= 0 ? this.cache.checkpoints[resultIndex] : undefined;\n }\n\n for (let index = resultIndex; index >= 0; index--) {\n const checkpoint = this.cache.checkpoints[index];\n if (checkpoint == null) {\n throw new Error('VirtualizedFileDiff: invalid checkpoint index');\n }\n if (checkpoint.renderedLineIndex % hunkLineCount === 0) {\n return checkpoint;\n }\n }\n\n return undefined;\n }\n\n private getExpandedLineCount(\n fileDiff: FileDiffMetadata,\n diffStyle: 'split' | 'unified'\n ): number {\n let count = 0;\n if (fileDiff.isPartial) {\n for (const hunk of fileDiff.hunks) {\n count +=\n diffStyle === 'split' ? hunk.splitLineCount : hunk.unifiedLineCount;\n }\n return count;\n }\n\n const {\n expandUnchanged = false,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n } = this.options;\n const expandedHunks = expandUnchanged\n ? true\n : this.hunksRenderer.getExpandedHunksMap();\n\n for (const [hunkIndex, hunk] of fileDiff.hunks.entries()) {\n const hunkCount =\n diffStyle === 'split' ? hunk.splitLineCount : hunk.unifiedLineCount;\n count += hunkCount;\n const collapsedBefore = Math.max(hunk.collapsedBefore, 0);\n const { fromStart, fromEnd, renderAll } = getExpandedRegion({\n isPartial: fileDiff.isPartial,\n rangeSize: collapsedBefore,\n expandedHunks,\n hunkIndex,\n collapsedContextThreshold,\n });\n if (collapsedBefore > 0) {\n count += renderAll ? collapsedBefore : fromStart + fromEnd;\n }\n }\n\n const trailingRegion = getTrailingExpandedRegion({\n fileDiff,\n hunkIndex: fileDiff.hunks.length - 1,\n expandedHunks,\n collapsedContextThreshold,\n errorPrefix: 'VirtualizedFileDiff',\n });\n if (trailingRegion != null) {\n count += trailingRegion.fromStart + trailingRegion.fromEnd;\n }\n\n return count;\n }\n\n private computeRenderRangeFromWindow(\n fileDiff: FileDiffMetadata,\n fileTop: number,\n { top, bottom }: RenderWindow\n ): RenderRange {\n const {\n disableFileHeader = false,\n expandUnchanged = false,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n } = this.options;\n const { hunkLineCount, lineHeight } = this.metrics;\n const diffStyle = this.getDiffStyle();\n const hunkSeparators = this.getHunkSeparatorType();\n const fileHeight = this.height;\n let lineCount =\n this.cache.totalLines > 0\n ? this.cache.totalLines\n : this.getExpandedLineCount(fileDiff, diffStyle);\n\n const headerRegion = getVirtualFileHeaderRegion(\n this.metrics,\n disableFileHeader\n );\n const paddingBottom =\n fileDiff.hunks.length > 0 ? getVirtualFilePaddingBottom(this.metrics) : 0;\n const { fileAnnotationHeight } = this.cache;\n const codeRegionTop = headerRegion + fileAnnotationHeight;\n const codeHeight = Math.max(\n 0,\n fileHeight - headerRegion - fileAnnotationHeight - paddingBottom\n );\n const hasFileAnnotations = this.hasFileAnnotations(fileDiff);\n const fileAnnotationTop = fileTop + headerRegion;\n const measuredFileAnnotationVisible =\n fileAnnotationHeight > 0 &&\n hasFileAnnotations &&\n fileAnnotationTop < bottom &&\n fileAnnotationTop + fileAnnotationHeight > top;\n\n // File is outside render window\n if (fileTop < top - fileHeight || fileTop > bottom) {\n return {\n startingLine: 0,\n totalLines: 0,\n bufferBefore: 0,\n bufferAfter: fileHeight - headerRegion - paddingBottom,\n };\n }\n\n // Whole file is under hunkLineCount, just render it all\n if (lineCount <= hunkLineCount || fileDiff.hunks.length === 0) {\n return {\n startingLine: 0,\n totalLines: hunkLineCount,\n bufferBefore: 0,\n bufferAfter: 0,\n };\n }\n\n this.approximateLayoutCheckpoints();\n lineCount = this.cache.totalLines > 0 ? this.cache.totalLines : lineCount;\n\n const estimatedTargetLines = Math.ceil(\n Math.max(bottom - top, 0) / lineHeight\n );\n const totalLines =\n Math.ceil(estimatedTargetLines / hunkLineCount) * hunkLineCount +\n hunkLineCount;\n const totalHunks = totalLines / hunkLineCount;\n const overflowHunks = totalHunks;\n const hunkOffsets: number[] = [];\n // Halfway between top & bottom, represented as an absolute position\n const viewportCenter = (top + bottom) / 2;\n // Start the scan before the viewport so we collect hunk offsets that may be\n // needed for bufferBefore. This only chooses the scan origin; the returned\n // render range is still computed from the visible window below.\n const checkpoint = this.getLayoutCheckpointBeforeTop(\n Math.max(0, top - fileTop - totalLines * lineHeight * 2),\n hunkLineCount\n );\n\n let absoluteLineTop = fileTop + (checkpoint?.top ?? codeRegionTop);\n let currentLine = checkpoint?.renderedLineIndex ?? 0;\n let firstVisibleHunk: number | undefined;\n let centerHunk: number | undefined;\n let overflowCounter: number | undefined;\n\n iterateOverDiff({\n diff: fileDiff,\n diffStyle,\n startingLine: checkpoint?.renderedLineIndex ?? 0,\n expandedHunks: expandUnchanged\n ? true\n : this.hunksRenderer.getExpandedHunksMap(),\n collapsedContextThreshold,\n callback: ({\n hunkIndex,\n hunk,\n collapsedBefore,\n collapsedAfter,\n deletionLine,\n additionLine,\n }) => {\n const splitLineIndex =\n additionLine != null\n ? additionLine.splitLineIndex\n : deletionLine.splitLineIndex;\n const unifiedLineIndex =\n additionLine != null\n ? additionLine.unifiedLineIndex\n : deletionLine.unifiedLineIndex;\n const hasMetadata =\n (additionLine?.noEOFCR ?? false) || (deletionLine?.noEOFCR ?? false);\n const leadingSeparator =\n collapsedBefore > 0\n ? getLeadingHunkSeparatorLayout({\n type: hunkSeparators,\n metrics: this.metrics,\n hunkIndex,\n hunkSpecs: hunk?.hunkSpecs,\n })\n : undefined;\n const gapAdjustment = leadingSeparator?.totalHeight ?? 0;\n\n absoluteLineTop += gapAdjustment;\n\n const isAtHunkBoundary = currentLine % hunkLineCount === 0;\n const currentHunk = Math.floor(currentLine / hunkLineCount);\n\n // Track the boundary positional offset at a hunk\n if (isAtHunkBoundary) {\n hunkOffsets[currentHunk] =\n absoluteLineTop - (fileTop + codeRegionTop + gapAdjustment);\n\n // Check if we should bail (overflow complete)\n if (overflowCounter != null) {\n if (overflowCounter <= 0) {\n return true;\n }\n overflowCounter--;\n }\n }\n\n const lineHeight = this.getLineHeight(\n diffStyle === 'split' ? splitLineIndex : unifiedLineIndex,\n hasMetadata\n );\n\n // Track visible region\n if (absoluteLineTop > top - lineHeight && absoluteLineTop < bottom) {\n firstVisibleHunk ??= currentHunk;\n }\n\n // Track which hunk contains the viewport center\n // If viewport center is above this line and we haven't set centerHunk yet,\n // this is the first line at or past the center\n if (\n centerHunk == null &&\n absoluteLineTop + lineHeight > viewportCenter\n ) {\n centerHunk = currentHunk;\n }\n\n // Start overflow when we are out of the viewport at a hunk boundary\n if (\n overflowCounter == null &&\n absoluteLineTop >= bottom &&\n isAtHunkBoundary\n ) {\n overflowCounter = overflowHunks;\n }\n\n currentLine++;\n absoluteLineTop += lineHeight;\n\n if (collapsedAfter > 0) {\n absoluteLineTop +=\n getTrailingHunkSeparatorLayout({\n type: hunkSeparators,\n metrics: this.metrics,\n })?.totalHeight ?? 0;\n }\n\n return false;\n },\n });\n\n // No visible lines found\n if (firstVisibleHunk == null) {\n if (measuredFileAnnotationVisible) {\n firstVisibleHunk = 0;\n centerHunk = 0;\n } else {\n return {\n startingLine: 0,\n totalLines: 0,\n bufferBefore: 0,\n bufferAfter: fileHeight - headerRegion - paddingBottom,\n };\n }\n }\n\n // Calculate balanced startingLine centered around the viewport center\n // Fall back to firstVisibleHunk if center wasn't found (e.g., center in a gap)\n centerHunk ??= firstVisibleHunk;\n const idealStartHunk = Math.round(centerHunk - totalHunks / 2);\n\n // Clamp startHunk: at the beginning, reduce totalLines; at the end, shift startHunk back\n const maxStartHunk = Math.max(\n 0,\n Math.ceil(lineCount / hunkLineCount) - totalHunks\n );\n const startHunk = Math.max(0, Math.min(idealStartHunk, maxStartHunk));\n const startingLine = startHunk * hunkLineCount;\n\n // If we wanted to start before 0, reduce totalLines by the clamped amount\n const clampedTotalLines =\n idealStartHunk < 0\n ? totalLines + idealStartHunk * hunkLineCount\n : totalLines;\n\n // Use hunkOffsets array for efficient buffer calculations\n const codeBufferBefore = hunkOffsets[startHunk] ?? 0;\n const bufferBefore =\n startingLine === 0 ? 0 : fileAnnotationHeight + codeBufferBefore;\n\n // Calculate bufferAfter using hunkOffset if available, otherwise use cumulative height\n const finalHunkIndex = startHunk + clampedTotalLines / hunkLineCount;\n const bufferAfter =\n finalHunkIndex < hunkOffsets.length\n ? codeHeight - hunkOffsets[finalHunkIndex]\n : // We stopped early, calculate from current position\n codeHeight - (absoluteLineTop - fileTop - codeRegionTop);\n\n return {\n startingLine,\n totalLines: clampedTotalLines,\n bufferBefore,\n bufferAfter: Math.max(0, bufferAfter),\n };\n }\n}\n\nfunction measureFileAnnotationHeight(\n codeGroups: (HTMLElement | undefined)[]\n): number | undefined {\n let height: number | undefined;\n for (const codeGroup of codeGroups) {\n if (codeGroup == null) continue;\n const content = codeGroup.children[1];\n if (!(content instanceof HTMLElement)) continue;\n for (const child of content.children) {\n if (!(child instanceof HTMLElement)) continue;\n if (child.dataset.lineAnnotation !== FILE_ANNOTATION_DOM_KEY) {\n continue;\n }\n height = Math.max(height ?? 0, child.getBoundingClientRect().height);\n }\n }\n return height;\n}\n\ninterface HeightDeltaPrefix {\n lineIndexes: number[];\n prefixTotals: number[];\n}\n\nfunction createHeightDeltaPrefix(\n heightDeltas: Map<number, number>\n): HeightDeltaPrefix {\n const entries = Array.from(heightDeltas).sort((a, b) => a[0] - b[0]);\n const lineIndexes: number[] = [];\n const prefixTotals = [0];\n let total = 0;\n for (const [lineIndex, delta] of entries) {\n lineIndexes.push(lineIndex);\n total += delta;\n prefixTotals.push(total);\n }\n return { lineIndexes, prefixTotals };\n}\n\nfunction sumHeightDeltas(\n { lineIndexes, prefixTotals }: HeightDeltaPrefix,\n startLineIndex: number,\n endLineIndex: number\n): number {\n if (startLineIndex >= endLineIndex || lineIndexes.length === 0) {\n return 0;\n }\n const start = lowerBound(lineIndexes, startLineIndex);\n const end = lowerBound(lineIndexes, endLineIndex);\n return (prefixTotals[end] ?? 0) - (prefixTotals[start] ?? 0);\n}\n\nfunction lowerBound(values: number[], target: number): number {\n let low = 0;\n let high = values.length;\n while (low < high) {\n const mid = (low + high) >> 1;\n const value = values[mid];\n if (value == null) {\n throw new Error('VirtualizedFileDiff: invalid prefix index');\n }\n if (value < target) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return low;\n}\n\nfunction getNextCheckpointIndex(renderedLineIndex: number): number {\n return (\n Math.ceil(renderedLineIndex / LAYOUT_CHECKPOINT_INTERVAL) *\n LAYOUT_CHECKPOINT_INTERVAL\n );\n}\n\nfunction countMetadataOffsetsBefore(\n metadataOffsets: number[],\n offset: number\n): number {\n let count = 0;\n for (const metadataOffset of metadataOffsets) {\n if (metadataOffset < offset) {\n count++;\n }\n }\n return count;\n}\n\nfunction getHunkMetadataOffsets({\n diffStyle,\n hunk,\n rowCount,\n}: {\n diffStyle: 'split' | 'unified';\n hunk: Hunk;\n rowCount: number;\n}): number[] {\n if (rowCount <= 0 || (!hunk.noEOFCRAdditions && !hunk.noEOFCRDeletions)) {\n return [];\n }\n\n const lastContent = hunk.hunkContent.at(-1);\n if (lastContent == null) {\n return [];\n }\n\n if (lastContent.type === 'context') {\n return [rowCount - 1];\n }\n\n const splitCount = Math.max(lastContent.deletions, lastContent.additions);\n const unifiedCount = lastContent.deletions + lastContent.additions;\n if (diffStyle === 'split') {\n return splitCount > 0 && (hunk.noEOFCRAdditions || hunk.noEOFCRDeletions)\n ? [rowCount - 1]\n : [];\n }\n\n const offsets: number[] = [];\n const contentStartOffset = rowCount - unifiedCount;\n if (lastContent.deletions > 0 && hunk.noEOFCRDeletions) {\n offsets.push(contentStartOffset + lastContent.deletions - 1);\n }\n if (lastContent.additions > 0 && hunk.noEOFCRAdditions) {\n offsets.push(rowCount - 1);\n }\n return offsets;\n}\n\nfunction hasDiffLayoutOptionChanged<LAnnotation>(\n previousOptions: FileDiffOptions<LAnnotation>,\n nextOptions: FileDiffOptions<LAnnotation>\n): boolean {\n return (\n (previousOptions.diffStyle ?? 'split') !==\n (nextOptions.diffStyle ?? 'split') ||\n (previousOptions.overflow ?? 'scroll') !==\n (nextOptions.overflow ?? 'scroll') ||\n (previousOptions.collapsed ?? false) !== (nextOptions.collapsed ?? false) ||\n (previousOptions.disableLineNumbers ?? false) !==\n (nextOptions.disableLineNumbers ?? false) ||\n (previousOptions.disableFileHeader ?? false) !==\n (nextOptions.disableFileHeader ?? false) ||\n (previousOptions.diffIndicators ?? 'bars') !==\n (nextOptions.diffIndicators ?? 'bars') ||\n (previousOptions.hunkSeparators ?? 'line-info') !==\n (nextOptions.hunkSeparators ?? 'line-info') ||\n (previousOptions.expandUnchanged ?? false) !==\n (nextOptions.expandUnchanged ?? false) ||\n (previousOptions.collapsedContextThreshold ??\n DEFAULT_COLLAPSED_CONTEXT_THRESHOLD) !==\n (nextOptions.collapsedContextThreshold ??\n DEFAULT_COLLAPSED_CONTEXT_THRESHOLD) ||\n previousOptions.unsafeCSS !== nextOptions.unsafeCSS\n );\n}\n\nfunction hasDiffEstimateOptionChanged<LAnnotation>(\n previousOptions: FileDiffOptions<LAnnotation>,\n nextOptions: FileDiffOptions<LAnnotation>\n): boolean {\n return (\n (previousOptions.disableFileHeader ?? false) !==\n (nextOptions.disableFileHeader ?? false) ||\n (previousOptions.hunkSeparators ?? 'line-info') !==\n (nextOptions.hunkSeparators ?? 'line-info') ||\n (previousOptions.expandUnchanged ?? false) !==\n (nextOptions.expandUnchanged ?? false) ||\n (previousOptions.collapsedContextThreshold ??\n DEFAULT_COLLAPSED_CONTEXT_THRESHOLD) !==\n (nextOptions.collapsedContextThreshold ??\n DEFAULT_COLLAPSED_CONTEXT_THRESHOLD)\n );\n}\n\nfunction getOptionHunkSeparatorType<LAnnotation>(\n hunkSeparators: FileDiffOptions<LAnnotation>['hunkSeparators'] | undefined\n): HunkSeparators {\n return typeof hunkSeparators === 'function'\n ? 'custom'\n : (hunkSeparators ?? 'line-info');\n}\n\n// Extracts the view-specific line index from the data-line-index attribute.\n// Format is \"unifiedIndex,splitIndex\"\nfunction parseLineIndex(\n lineIndexAttr: string,\n diffStyle: 'split' | 'unified'\n): number {\n const [unifiedIndex, splitIndex] = lineIndexAttr.split(',').map(Number);\n return diffStyle === 'split' ? splitIndex : unifiedIndex;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Virtualizer.d.ts","names":[
|
|
1
|
+
{"version":3,"file":"Virtualizer.d.ts","names":[],"sources":["../../src/components/Virtualizer.ts"],"mappings":";;;UAKU,kBAAA;EACR,QAAA,CAAS,KAAA;EACT,gBAAA;EACA,aAAA,CAAc,OAAA;AAAA;AAAA,UAiBC,iBAAA;EAnBf;EAqBA,cAAA;EApBA;EAsBA,0BAAA;EArBc;EAuBd,eAAA;AAAA;AAAA,cAaW,WAAA;EAAA,OACJ,MAAA;EAAA,OACA,oBAAA;EAAA,SAES,IAAA;EAAA,SACA,MAAA,EAAQ,iBAAA;EACjB,IAAA;EAAA,QACC,oBAAA;EAAA,QACA,SAAA;EAAA,QACA,MAAA;EAAA,QACA,YAAA;EAAA,QACA,WAAA;EAAA,QACA,IAAA;EAAA,QACA,gBAAA;EAAA,QAEA,cAAA;EAAA,QACA,SAAA;EAAA,QACA,gBAAA;EAAA,QACA,qBAAA;EAAA,QACA,gBAAA;EAAA,QAEA,WAAA;EAAA,QACA,WAAA;EAAA,QACA,iBAAA;EAAA,QACA,iBAAA;EAAA,QACA,YAAA;EAER,WAAA,CAAY,MAAA,GAAS,OAAA,CAAQ,iBAAA;EAI7B,KAAA,CAAM,IAAA,EAAM,WAAA,GAAc,QAAA,EAAU,gBAAA,GAAmB,OAAA;EA2CvD,eAAA,CAAgB,QAAA,EAAU,kBAAA,EAAoB,QAAA;EAQ9C,cAAA,IAAkB,kBAAA;EAYlB,iBAAA,CAAkB,UAAA,UAAoB,aAAA;EAAA,QAS9B,qBAAA;EAAA,QA0CA,WAAA;EAAA,QAaA,YAAA;EAeR,OAAA;EAqBA,0BAAA,CAA2B,OAAA,EAAS,WAAA;EAOpC,OAAA,CAAQ,SAAA,EAAW,WAAA,EAAa,QAAA,EAAU,kBAAA;EAmB1C,UAAA,CAAW,SAAA,EAAW,WAAA;EAAA,QAed,kBAAA;EAAA,QAQA,kBAAA;EAAA,QAYA,mBAAA;EAAA,QAYA,yBAAA;EAAA,QA8EA,SAAA;EAAA,QAiCA,cAAA;EAAA,QAsBA,eAAA;EAAA,QAqGA,wBAAA;EAAA,QAuCA,YAAA;EAAA,QAyBA,eAAA;EAAA,QAiBA,SAAA;EAiBR,YAAA;EAAA,QAMQ,yBAAA;AAAA"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { queueRender } from "../managers/UniversalRenderingManager.js";
|
|
2
2
|
import { createWindowFromScrollPosition } from "../utils/createWindowFromScrollPosition.js";
|
|
3
3
|
import { areVirtualWindowSpecsEqual } from "../utils/areVirtualWindowSpecsEqual.js";
|
|
4
|
-
|
|
5
4
|
//#region src/components/Virtualizer.ts
|
|
6
5
|
const DEFAULT_OVERSCROLL_SIZE = 1e3;
|
|
7
6
|
const INTERSECTION_OBSERVER_MARGIN = DEFAULT_OVERSCROLL_SIZE * 4;
|
|
@@ -72,13 +71,13 @@ var Virtualizer = class Virtualizer {
|
|
|
72
71
|
Virtualizer.__STOP = true;
|
|
73
72
|
}
|
|
74
73
|
};
|
|
75
|
-
for (const [container, instance
|
|
74
|
+
for (const [container, instance] of this.connectQueue.entries()) this.connect(container, instance);
|
|
76
75
|
this.connectQueue.clear();
|
|
77
76
|
this.markDOMDirty();
|
|
78
77
|
queueRender(this.computeRenderRangeAndEmit);
|
|
79
78
|
}
|
|
80
|
-
instanceChanged(instance
|
|
81
|
-
this.instancesChanged.add(instance
|
|
79
|
+
instanceChanged(instance, domDirty) {
|
|
80
|
+
this.instancesChanged.add(instance);
|
|
82
81
|
if (domDirty) this.markDOMDirty();
|
|
83
82
|
queueRender(this.computeRenderRangeAndEmit);
|
|
84
83
|
}
|
|
@@ -177,22 +176,22 @@ var Virtualizer = class Virtualizer {
|
|
|
177
176
|
getOffsetInScrollContainer(element) {
|
|
178
177
|
return this.getScrollTop() + getRelativeBoundingTop(element, this.getScrollContainerElement());
|
|
179
178
|
}
|
|
180
|
-
connect(container, instance
|
|
179
|
+
connect(container, instance) {
|
|
181
180
|
if (this.observers.has(container)) throw new Error("Virtualizer.connect: instance is already connected...");
|
|
182
|
-
if (this.intersectionObserver == null) this.connectQueue.set(container, instance
|
|
181
|
+
if (this.intersectionObserver == null) this.connectQueue.set(container, instance);
|
|
183
182
|
else {
|
|
184
183
|
this.intersectionObserver.observe(container);
|
|
185
|
-
this.observers.set(container, instance
|
|
186
|
-
this.instancesChanged.add(instance
|
|
184
|
+
this.observers.set(container, instance);
|
|
185
|
+
this.instancesChanged.add(instance);
|
|
187
186
|
this.markDOMDirty();
|
|
188
187
|
queueRender(this.computeRenderRangeAndEmit);
|
|
189
188
|
}
|
|
190
189
|
return () => this.disconnect(container);
|
|
191
190
|
}
|
|
192
191
|
disconnect(container) {
|
|
193
|
-
const instance
|
|
192
|
+
const instance = this.observers.get(container);
|
|
194
193
|
this.connectQueue.delete(container);
|
|
195
|
-
if (instance
|
|
194
|
+
if (instance == null) return;
|
|
196
195
|
this.intersectionObserver?.unobserve(container);
|
|
197
196
|
this.observers.delete(container);
|
|
198
197
|
if (this.visibleInstances.delete(container)) this.visibleInstancesDirty = true;
|
|
@@ -233,13 +232,13 @@ var Virtualizer = class Virtualizer {
|
|
|
233
232
|
this.renderedObservers = this.observers.size;
|
|
234
233
|
const anchor = this.getScrollAnchor(this.height);
|
|
235
234
|
const updatedInstances = /* @__PURE__ */ new Set();
|
|
236
|
-
for (const instance
|
|
237
|
-
for (const instance
|
|
238
|
-
if (updatedInstances.has(instance
|
|
239
|
-
if (instance
|
|
235
|
+
for (const instance of wrapperDirty ? this.observers.values() : this.visibleInstances.values()) if (instance.onRender(wrapperDirty)) updatedInstances.add(instance);
|
|
236
|
+
for (const instance of this.instancesChanged) {
|
|
237
|
+
if (updatedInstances.has(instance)) continue;
|
|
238
|
+
if (instance.onRender(wrapperDirty)) updatedInstances.add(instance);
|
|
240
239
|
}
|
|
241
240
|
this.scrollFix(anchor);
|
|
242
|
-
for (const instance
|
|
241
|
+
for (const instance of updatedInstances) instance.reconcileHeights();
|
|
243
242
|
instancesHaveChanged ||= this.instancesChanged.size > 0;
|
|
244
243
|
if (instancesHaveChanged) this.markDOMDirty();
|
|
245
244
|
if (instancesHaveChanged || wrapperDirty) queueRender(this.computeRenderRangeAndEmit);
|
|
@@ -253,9 +252,9 @@ var Virtualizer = class Virtualizer {
|
|
|
253
252
|
if (lineIndex != null && lineOffset != null) {
|
|
254
253
|
const element = fileElement.shadowRoot?.querySelector(`[data-line][data-line-index="${lineIndex}"]`);
|
|
255
254
|
if (element instanceof HTMLElement) {
|
|
256
|
-
const top
|
|
257
|
-
if (top
|
|
258
|
-
const scrollOffset = top
|
|
255
|
+
const top = getRelativeBoundingTop(element, scrollContainer);
|
|
256
|
+
if (top !== lineOffset) {
|
|
257
|
+
const scrollOffset = top - lineOffset;
|
|
259
258
|
this.applyScrollFix(scrollOffset);
|
|
260
259
|
}
|
|
261
260
|
return;
|
|
@@ -329,14 +328,14 @@ var Virtualizer = class Virtualizer {
|
|
|
329
328
|
this.scrollDirty = true;
|
|
330
329
|
for (const { target, isIntersecting } of entries) {
|
|
331
330
|
if (!(target instanceof HTMLElement)) throw new Error("Virtualizer.handleIntersectionChange: target not an HTMLElement");
|
|
332
|
-
const instance
|
|
333
|
-
if (instance
|
|
331
|
+
const instance = this.observers.get(target);
|
|
332
|
+
if (instance == null) continue;
|
|
334
333
|
if (isIntersecting && !this.visibleInstances.has(target)) {
|
|
335
|
-
instance
|
|
336
|
-
this.visibleInstances.set(target, instance
|
|
334
|
+
instance.setVisibility(true);
|
|
335
|
+
this.visibleInstances.set(target, instance);
|
|
337
336
|
this.visibleInstancesDirty = true;
|
|
338
337
|
} else if (!isIntersecting && this.visibleInstances.has(target)) {
|
|
339
|
-
instance
|
|
338
|
+
instance.setVisibility(false);
|
|
340
339
|
this.visibleInstances.delete(target);
|
|
341
340
|
this.visibleInstancesDirty = true;
|
|
342
341
|
}
|
|
@@ -389,7 +388,7 @@ function getRelativeBoundingTop(element, scrollContainer) {
|
|
|
389
388
|
const scrollContainerTop = scrollContainer?.getBoundingClientRect().top ?? 0;
|
|
390
389
|
return rect.top - scrollContainerTop;
|
|
391
390
|
}
|
|
392
|
-
|
|
393
391
|
//#endregion
|
|
394
392
|
export { Virtualizer };
|
|
393
|
+
|
|
395
394
|
//# sourceMappingURL=Virtualizer.js.map
|