@pierre/diffs 1.2.11 → 1.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -9
- package/dist/components/CodeView.d.ts +10 -11
- package/dist/components/CodeView.d.ts.map +1 -1
- package/dist/components/CodeView.js +7 -8
- package/dist/components/CodeView.js.map +1 -1
- package/dist/components/File.d.ts +1 -4
- package/dist/components/File.d.ts.map +1 -1
- package/dist/components/File.js +13 -11
- package/dist/components/File.js.map +1 -1
- package/dist/components/FileDiff.d.ts +11 -14
- package/dist/components/FileDiff.d.ts.map +1 -1
- package/dist/components/FileDiff.js +15 -13
- 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 +4 -4
- package/dist/components/FileStream.js.map +1 -1
- package/dist/components/UnresolvedFile.d.ts +2 -2
- package/dist/components/UnresolvedFile.d.ts.map +1 -1
- package/dist/components/UnresolvedFile.js +7 -5
- package/dist/components/UnresolvedFile.js.map +1 -1
- package/dist/components/VirtualizedFile.d.ts +0 -1
- package/dist/components/VirtualizedFile.d.ts.map +1 -1
- package/dist/components/VirtualizedFile.js +19 -18
- package/dist/components/VirtualizedFile.js.map +1 -1
- package/dist/components/VirtualizedFileDiff.d.ts +2 -3
- package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
- package/dist/components/VirtualizedFileDiff.js +17 -18
- 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 +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +1 -1
- package/dist/constants.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 +9 -9
- package/dist/index.js +1 -2
- package/dist/managers/InteractionManager.d.ts.map +1 -1
- package/dist/managers/InteractionManager.js +3 -3
- package/dist/managers/InteractionManager.js.map +1 -1
- package/dist/managers/ResizeManager.d.ts.map +1 -1
- package/dist/managers/ResizeManager.js +1 -1
- 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 +0 -1
- package/dist/react/CodeView.d.ts.map +1 -1
- package/dist/react/CodeView.js +9 -12
- package/dist/react/CodeView.js.map +1 -1
- package/dist/react/File.d.ts.map +1 -1
- package/dist/react/File.js +2 -5
- package/dist/react/File.js.map +1 -1
- package/dist/react/FileDiff.d.ts.map +1 -1
- package/dist/react/FileDiff.js +2 -5
- package/dist/react/FileDiff.js.map +1 -1
- package/dist/react/MultiFileDiff.d.ts.map +1 -1
- package/dist/react/MultiFileDiff.js +2 -5
- package/dist/react/MultiFileDiff.js.map +1 -1
- package/dist/react/PatchDiff.d.ts.map +1 -1
- package/dist/react/PatchDiff.js +2 -5
- package/dist/react/PatchDiff.js.map +1 -1
- package/dist/react/UnresolvedFile.d.ts +1 -1
- package/dist/react/UnresolvedFile.d.ts.map +1 -1
- package/dist/react/UnresolvedFile.js +2 -5
- 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 +1 -1
- 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.map +1 -1
- package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.js +4 -5
- package/dist/react/utils/renderDiffChildren.js.map +1 -1
- package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
- package/dist/react/utils/renderFileChildren.js +4 -5
- 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 -2
- 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 +1 -2
- package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/DiffHunksRenderer.js +23 -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 +13 -11
- 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 +1 -1
- 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 +1 -1
- 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/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 +1 -2
- 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 -3
- 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.map +1 -1
- package/dist/utils/includesFileAnnotations.js +5 -5
- package/dist/utils/includesFileAnnotations.js.map +1 -1
- 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/iterateOverFile.d.ts.map +1 -1
- package/dist/utils/iterateOverFile.js +1 -1
- package/dist/utils/iterateOverFile.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 +4 -5
- package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
- package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
- package/dist/utils/renderFileWithHighlighter.js +1 -2
- 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 -2
- 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/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 +2763 -6368
- package/dist/worker/worker-portable.js.map +1 -1
- package/dist/worker/worker.js +89 -124
- package/dist/worker/worker.js.map +1 -1
- package/package.json +15 -13
- package/dist/worker/wasm-qE0LgnY3.js +0 -10
- package/dist/worker/wasm-qE0LgnY3.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileStream.d.ts","names":[
|
|
1
|
+
{"version":3,"file":"FileStream.d.ts","names":[],"sources":["../../src/components/FileStream.ts"],"mappings":";;;UAsBiB,iBAAA,SAA0B,eAAA;EACzC,IAAA,GAAO,kBAAA;EACP,iBAAA;EAEA,WAAA,EAAa,QAAA,EAAU,UAAA;EACvB,YAAA,EAAc,QAAA,EAAU,UAAA;EAExB,aAAA,EAAe,UAAA,EAAY,+BAAA;EAC3B,aAAA,EAAe,KAAA,EAAO,WAAA,GAAc,WAAA;EACpC,aAAA;EACA,aAAA,EAAe,MAAA;AAAA;AAAA,cAKJ,UAAA;EAeQ,OAAA,EAAS,iBAAA;EAAA,SAdnB,IAAA;EAAA,QAED,WAAA;EAAA,QACA,MAAA;EAAA,QACA,eAAA;EAAA,QACA,aAAA;EAAA,QACA,GAAA;EAAA,QACA,IAAA;EAAA,QACA,aAAA;EAAA,QACA,cAAA;EAAA,QACA,aAAA;EAAA,QACA,eAAA;EAAA,QACA,eAAA;EAER,WAAA,CAAmB,OAAA,GAAS,iBAAA;EAI5B,OAAA;EAKA,YAAA,CAAa,SAAA,EAAW,UAAA;EAAA,QAoBV,qBAAA;EAAA,QAON,eAAA;EACF,KAAA,CACJ,OAAA,EAAS,cAAA,UACT,QAAA,EAAU,WAAA,GACT,OAAA;EAAA,QAkBK,WAAA;EAAA,QA+FA,YAAA;EAAA,QACA,WAAA;EAAA,QAYA,gBAAA;EAAA,QACA,kBAAA;EAAA,QACA,MAAA;EAAA,QA8CA,wBAAA;EAAA,QAqBA,aAAA;EAAA,QASA,UAAA;EAAA,QAwBA,wBAAA;EAAA,QAoBA,eAAA;AAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DEFAULT_THEMES
|
|
1
|
+
import { DEFAULT_THEMES } from "../constants.js";
|
|
2
2
|
import { queueRender } from "../managers/UniversalRenderingManager.js";
|
|
3
3
|
import { getSharedHighlighter } from "../highlighter/shared_highlighter.js";
|
|
4
4
|
import { getHighlighterOptions } from "../utils/getHighlighterOptions.js";
|
|
@@ -11,10 +11,10 @@ import { upsertHostThemeStyle } from "../utils/hostTheme.js";
|
|
|
11
11
|
import { setPreNodeProperties } from "../utils/setWrapperNodeProps.js";
|
|
12
12
|
import { CodeToTokenTransformStream } from "../shiki-stream/stream.js";
|
|
13
13
|
import { createSpanFromToken } from "../utils/createSpanNodeFromToken.js";
|
|
14
|
-
|
|
15
14
|
//#region src/components/FileStream.ts
|
|
16
15
|
let instanceId = -1;
|
|
17
16
|
var FileStream = class {
|
|
17
|
+
options;
|
|
18
18
|
__id = `file-stream:${++instanceId}`;
|
|
19
19
|
highlighter;
|
|
20
20
|
stream;
|
|
@@ -217,7 +217,7 @@ var FileStream = class {
|
|
|
217
217
|
this.themeCSSStyle = void 0;
|
|
218
218
|
this.appliedThemeCSS = void 0;
|
|
219
219
|
}
|
|
220
|
-
this.fileContainer = fileContainer ?? document.createElement(
|
|
220
|
+
this.fileContainer = fileContainer ?? document.createElement("diffs-container");
|
|
221
221
|
return this.fileContainer;
|
|
222
222
|
}
|
|
223
223
|
applyThemeState(container, themeStyles, themeType, baseThemeType) {
|
|
@@ -244,7 +244,7 @@ var FileStream = class {
|
|
|
244
244
|
} : void 0;
|
|
245
245
|
}
|
|
246
246
|
};
|
|
247
|
-
|
|
248
247
|
//#endregion
|
|
249
248
|
export { FileStream };
|
|
249
|
+
|
|
250
250
|
//# sourceMappingURL=FileStream.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileStream.js","names":["options: FileStreamOptions"],"sources":["../../src/components/FileStream.ts"],"sourcesContent":["import { DEFAULT_THEMES, DIFFS_TAG_NAME } from '../constants';\nimport { getSharedHighlighter } from '../highlighter/shared_highlighter';\nimport { queueRender } from '../managers/UniversalRenderingManager';\nimport { CodeToTokenTransformStream, type RecallToken } from '../shiki-stream';\nimport type {\n AppliedThemeStyleCache,\n BaseCodeOptions,\n DiffsHighlighter,\n SupportedLanguages,\n ThemedToken,\n ThemeTypes,\n} from '../types';\nimport { createSpanFromToken } from '../utils/createSpanNodeFromToken';\nimport { wrapThemeCSS } from '../utils/cssWrappers';\nimport { formatCSSVariablePrefix } from '../utils/formatCSSVariablePrefix';\nimport { getHighlighterOptions } from '../utils/getHighlighterOptions';\nimport { getHighlighterThemeStyles } from '../utils/getHighlighterThemeStyles';\nimport { getOrCreateCodeNode } from '../utils/getOrCreateCodeNode';\nimport { upsertHostThemeStyle } from '../utils/hostTheme';\nimport { getMeasuredScrollbarGutter } from '../utils/scrollbarGutter';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\n\nexport interface FileStreamOptions extends BaseCodeOptions {\n lang?: SupportedLanguages;\n startingLineIndex?: number;\n\n onPreRender?(instance: FileStream): unknown;\n onPostRender?(instance: FileStream): unknown;\n\n onStreamStart?(controller: WritableStreamDefaultController): unknown;\n onStreamWrite?(token: ThemedToken | RecallToken): unknown;\n onStreamClose?(): unknown;\n onStreamAbort?(reason: unknown): unknown;\n}\n\nlet instanceId = -1;\n\nexport class FileStream {\n readonly __id: string = `file-stream:${++instanceId}`;\n\n private highlighter: DiffsHighlighter | undefined;\n private stream: ReadableStream<string> | undefined;\n private abortController: AbortController | undefined;\n private fileContainer: HTMLElement | undefined;\n private pre: HTMLPreElement | undefined;\n private code: HTMLElement | undefined;\n private gutterElement: HTMLElement | undefined;\n private contentElement: HTMLElement | undefined;\n private themeCSSStyle: HTMLStyleElement | undefined;\n private appliedThemeCSS: AppliedThemeStyleCache | undefined;\n private currentRowCount = 0;\n\n constructor(public options: FileStreamOptions = { theme: DEFAULT_THEMES }) {\n this.currentLineIndex = this.options.startingLineIndex ?? 1;\n }\n\n cleanUp(): void {\n this.abortController?.abort();\n this.abortController = undefined;\n }\n\n setThemeType(themeType: ThemeTypes): void {\n if ((this.options.themeType ?? 'system') === themeType) {\n return;\n }\n this.options = { ...this.options, themeType };\n if (\n typeof this.options.theme === 'string' ||\n this.fileContainer == null ||\n this.appliedThemeCSS == null\n ) {\n return;\n }\n this.applyThemeState(\n this.fileContainer,\n this.appliedThemeCSS.themeStyles,\n themeType,\n this.appliedThemeCSS.baseThemeType\n );\n }\n\n private async initializeHighlighter(): Promise<DiffsHighlighter> {\n this.highlighter = await getSharedHighlighter(\n getHighlighterOptions(this.options.lang, this.options)\n );\n return this.highlighter;\n }\n\n private queuedSetupArgs: [ReadableStream<string>, HTMLElement] | undefined;\n async setup(\n _source: ReadableStream<string>,\n _wrapper: HTMLElement\n ): Promise<void> {\n const isSettingUp = this.queuedSetupArgs != null;\n this.queuedSetupArgs = [_source, _wrapper];\n if (isSettingUp) {\n // TODO(amadeus): Make it so that this function can be properly\n // awaitable, maybe?\n return;\n }\n this.highlighter ??= await this.initializeHighlighter();\n\n const [source, wrapper] = this.queuedSetupArgs;\n this.queuedSetupArgs = undefined;\n\n const stream = source;\n\n this.setupStream(stream, wrapper, this.highlighter);\n }\n\n private setupStream(\n stream: ReadableStream<string>,\n wrapper: HTMLElement,\n highlighter: DiffsHighlighter\n ): void {\n const {\n disableLineNumbers = false,\n overflow = 'scroll',\n theme = DEFAULT_THEMES,\n themeType = 'system',\n } = this.options;\n const fileContainer = this.getOrCreateFileContainer();\n if (fileContainer.parentElement == null) {\n wrapper.appendChild(fileContainer);\n }\n this.pre ??= document.createElement('pre');\n if (this.pre.parentElement == null) {\n fileContainer.shadowRoot?.appendChild(this.pre);\n }\n const baseThemeType =\n typeof theme === 'string' ? highlighter.getTheme(theme).type : undefined;\n const themeStyles = getHighlighterThemeStyles({ theme, highlighter });\n this.applyThemeState(fileContainer, themeStyles, themeType, baseThemeType);\n const pre = setPreNodeProperties(this.pre, {\n type: 'file',\n diffIndicators: 'none',\n disableBackground: true,\n disableLineNumbers,\n overflow,\n split: false,\n totalLines: 0,\n });\n pre.textContent = '';\n\n this.pre = pre;\n this.code = getOrCreateCodeNode({ code: this.code, pre });\n this.gutterElement = undefined;\n this.contentElement = undefined;\n this.currentRowCount = 0;\n this.currentLineElement = undefined;\n this.currentLineIndex = this.options.startingLineIndex ?? 1;\n this.abortController?.abort();\n this.abortController = new AbortController();\n const { onStreamStart, onStreamClose, onStreamAbort } = this.options;\n // Cancel the prior source so upstream producers stop generating tokens.\n // Swallow AbortError / locked-stream rejections since we're tearing down.\n this.stream?.cancel().catch(() => {});\n this.stream = stream;\n this.stream\n // tokenizeTimeLimit: 0 — never trade silently-wrong token colors for\n // latency; see renderFileWithHighlighter for the full rationale.\n .pipeThrough(\n typeof theme === 'string'\n ? new CodeToTokenTransformStream({\n ...this.options,\n theme,\n highlighter,\n allowRecalls: true,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n tokenizeTimeLimit: 0,\n })\n : new CodeToTokenTransformStream({\n ...this.options,\n themes: theme,\n highlighter,\n allowRecalls: true,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n tokenizeTimeLimit: 0,\n })\n )\n .pipeTo(\n new WritableStream({\n start(controller) {\n onStreamStart?.(controller);\n },\n close() {\n onStreamClose?.();\n },\n abort(reason) {\n onStreamAbort?.(reason);\n },\n write: this.handleWrite,\n }),\n { signal: this.abortController.signal }\n )\n .catch((error) => {\n // Ignore AbortError - it's expected when cleaning up\n if (error.name !== 'AbortError') {\n console.error('FileStream pipe error:', error);\n }\n });\n }\n\n private queuedTokens: (ThemedToken | RecallToken)[] = [];\n private handleWrite = (token: ThemedToken | RecallToken) => {\n // If we've recalled tokens we haven't rendered yet, we can just yeet them\n // and never apply them\n if ('recall' in token && this.queuedTokens.length >= token.recall) {\n this.queuedTokens.length = this.queuedTokens.length - token.recall;\n } else {\n this.queuedTokens.push(token);\n }\n queueRender(this.render);\n this.options.onStreamWrite?.(token);\n };\n\n private currentLineIndex: number;\n private currentLineElement: HTMLElement | undefined;\n private render = () => {\n this.options.onPreRender?.(this);\n const { gutter, content } = this.getOrCreateStreamColumns();\n const gutterFragment = document.createDocumentFragment();\n const contentFragment = document.createDocumentFragment();\n for (const token of this.queuedTokens) {\n if ('recall' in token) {\n if (this.currentLineElement == null) {\n throw new Error(\n 'FileStream.render: no current line element, shouldnt be possible to get here'\n );\n }\n if (token.recall > this.currentLineElement.childNodes.length) {\n throw new Error(\n `FileStream.render: Token recall exceed the current line, there's probably a bug...`\n );\n }\n for (let i = 0; i < token.recall; i++) {\n this.currentLineElement.lastChild?.remove();\n }\n } else {\n const span = createSpanFromToken(token);\n if (this.currentLineElement == null) {\n const { gutterLine, contentLine } = this.createLine();\n gutterFragment.appendChild(gutterLine);\n contentFragment.appendChild(contentLine);\n }\n this.currentLineElement?.appendChild(span);\n if (token.content === '\\n') {\n this.currentLineIndex++;\n const { gutterLine, contentLine } = this.createLine();\n gutterFragment.appendChild(gutterLine);\n contentFragment.appendChild(contentLine);\n }\n }\n }\n if (gutterFragment.childNodes.length > 0) {\n gutter.appendChild(gutterFragment);\n }\n if (contentFragment.childNodes.length > 0) {\n content.appendChild(contentFragment);\n }\n this.queuedTokens.length = 0;\n this.options.onPostRender?.(this);\n };\n\n private getOrCreateStreamColumns(): {\n gutter: HTMLElement;\n content: HTMLElement;\n } {\n if (this.code == null) {\n throw new Error('FileStream: expected code element to exist');\n }\n if (this.gutterElement != null && this.contentElement != null) {\n return { gutter: this.gutterElement, content: this.contentElement };\n }\n const gutter = document.createElement('div');\n gutter.dataset.gutter = '';\n const content = document.createElement('div');\n content.dataset.content = '';\n this.code.appendChild(gutter);\n this.code.appendChild(content);\n this.gutterElement = gutter;\n this.contentElement = content;\n return { gutter, content };\n }\n\n private updateRowSpan(): void {\n if (this.gutterElement != null) {\n this.gutterElement.style.gridRow = `span ${this.currentRowCount}`;\n }\n if (this.contentElement != null) {\n this.contentElement.style.gridRow = `span ${this.currentRowCount}`;\n }\n }\n\n private createLine(): { gutterLine: HTMLElement; contentLine: HTMLElement } {\n const lineNumber = this.currentLineIndex;\n const lineIndex = `${lineNumber - 1}`;\n const gutterLine = document.createElement('div');\n gutterLine.dataset.columnNumber = `${lineNumber}`;\n gutterLine.dataset.lineType = 'context';\n gutterLine.dataset.lineIndex = lineIndex;\n\n const numberContent = document.createElement('span');\n numberContent.dataset.lineNumberContent = '';\n numberContent.textContent = `${lineNumber}`;\n gutterLine.appendChild(numberContent);\n\n const contentLine = document.createElement('div');\n contentLine.dataset.line = `${lineNumber}`;\n contentLine.dataset.lineType = 'context';\n contentLine.dataset.lineIndex = lineIndex;\n\n this.currentRowCount += 1;\n this.updateRowSpan();\n this.currentLineElement = contentLine;\n return { gutterLine, contentLine };\n }\n\n private getOrCreateFileContainer(fileContainer?: HTMLElement): HTMLElement {\n if (\n (fileContainer != null && fileContainer === this.fileContainer) ||\n (fileContainer == null && this.fileContainer != null)\n ) {\n return this.fileContainer;\n }\n if (\n this.fileContainer != null &&\n fileContainer != null &&\n fileContainer !== this.fileContainer\n ) {\n this.themeCSSStyle = undefined;\n this.appliedThemeCSS = undefined;\n }\n this.fileContainer =\n fileContainer ?? document.createElement(DIFFS_TAG_NAME);\n return this.fileContainer;\n }\n\n private applyThemeState(\n container: HTMLElement,\n themeStyles: string,\n themeType: ThemeTypes,\n baseThemeType?: 'light' | 'dark'\n ): void {\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n const effectiveThemeType = baseThemeType ?? themeType;\n const currentTheme = this.options.theme ?? DEFAULT_THEMES;\n const theme =\n typeof currentTheme === 'string' ? currentTheme : { ...currentTheme };\n const scrollbarGutter = getMeasuredScrollbarGutter(shadowRoot);\n if (\n this.themeCSSStyle?.parentNode === shadowRoot &&\n this.appliedThemeCSS?.themeStyles === themeStyles &&\n this.appliedThemeCSS.themeType === effectiveThemeType &&\n this.appliedThemeCSS.scrollbarGutter === scrollbarGutter\n ) {\n this.appliedThemeCSS.theme = theme;\n return;\n }\n this.themeCSSStyle = upsertHostThemeStyle({\n shadowRoot,\n currentNode: this.themeCSSStyle,\n themeCSS: wrapThemeCSS(themeStyles, effectiveThemeType, scrollbarGutter),\n });\n this.appliedThemeCSS =\n this.themeCSSStyle != null\n ? {\n theme,\n themeStyles,\n themeType: effectiveThemeType,\n baseThemeType,\n scrollbarGutter,\n }\n : undefined;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FileStream.js","names":[],"sources":["../../src/components/FileStream.ts"],"sourcesContent":["import { DEFAULT_THEMES, DIFFS_TAG_NAME } from '../constants';\nimport { getSharedHighlighter } from '../highlighter/shared_highlighter';\nimport { queueRender } from '../managers/UniversalRenderingManager';\nimport { CodeToTokenTransformStream, type RecallToken } from '../shiki-stream';\nimport type {\n AppliedThemeStyleCache,\n BaseCodeOptions,\n DiffsHighlighter,\n SupportedLanguages,\n ThemedToken,\n ThemeTypes,\n} from '../types';\nimport { createSpanFromToken } from '../utils/createSpanNodeFromToken';\nimport { wrapThemeCSS } from '../utils/cssWrappers';\nimport { formatCSSVariablePrefix } from '../utils/formatCSSVariablePrefix';\nimport { getHighlighterOptions } from '../utils/getHighlighterOptions';\nimport { getHighlighterThemeStyles } from '../utils/getHighlighterThemeStyles';\nimport { getOrCreateCodeNode } from '../utils/getOrCreateCodeNode';\nimport { upsertHostThemeStyle } from '../utils/hostTheme';\nimport { getMeasuredScrollbarGutter } from '../utils/scrollbarGutter';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\n\nexport interface FileStreamOptions extends BaseCodeOptions {\n lang?: SupportedLanguages;\n startingLineIndex?: number;\n\n onPreRender?(instance: FileStream): unknown;\n onPostRender?(instance: FileStream): unknown;\n\n onStreamStart?(controller: WritableStreamDefaultController): unknown;\n onStreamWrite?(token: ThemedToken | RecallToken): unknown;\n onStreamClose?(): unknown;\n onStreamAbort?(reason: unknown): unknown;\n}\n\nlet instanceId = -1;\n\nexport class FileStream {\n readonly __id: string = `file-stream:${++instanceId}`;\n\n private highlighter: DiffsHighlighter | undefined;\n private stream: ReadableStream<string> | undefined;\n private abortController: AbortController | undefined;\n private fileContainer: HTMLElement | undefined;\n private pre: HTMLPreElement | undefined;\n private code: HTMLElement | undefined;\n private gutterElement: HTMLElement | undefined;\n private contentElement: HTMLElement | undefined;\n private themeCSSStyle: HTMLStyleElement | undefined;\n private appliedThemeCSS: AppliedThemeStyleCache | undefined;\n private currentRowCount = 0;\n\n constructor(public options: FileStreamOptions = { theme: DEFAULT_THEMES }) {\n this.currentLineIndex = this.options.startingLineIndex ?? 1;\n }\n\n cleanUp(): void {\n this.abortController?.abort();\n this.abortController = undefined;\n }\n\n setThemeType(themeType: ThemeTypes): void {\n if ((this.options.themeType ?? 'system') === themeType) {\n return;\n }\n this.options = { ...this.options, themeType };\n if (\n typeof this.options.theme === 'string' ||\n this.fileContainer == null ||\n this.appliedThemeCSS == null\n ) {\n return;\n }\n this.applyThemeState(\n this.fileContainer,\n this.appliedThemeCSS.themeStyles,\n themeType,\n this.appliedThemeCSS.baseThemeType\n );\n }\n\n private async initializeHighlighter(): Promise<DiffsHighlighter> {\n this.highlighter = await getSharedHighlighter(\n getHighlighterOptions(this.options.lang, this.options)\n );\n return this.highlighter;\n }\n\n private queuedSetupArgs: [ReadableStream<string>, HTMLElement] | undefined;\n async setup(\n _source: ReadableStream<string>,\n _wrapper: HTMLElement\n ): Promise<void> {\n const isSettingUp = this.queuedSetupArgs != null;\n this.queuedSetupArgs = [_source, _wrapper];\n if (isSettingUp) {\n // TODO(amadeus): Make it so that this function can be properly\n // awaitable, maybe?\n return;\n }\n this.highlighter ??= await this.initializeHighlighter();\n\n const [source, wrapper] = this.queuedSetupArgs;\n this.queuedSetupArgs = undefined;\n\n const stream = source;\n\n this.setupStream(stream, wrapper, this.highlighter);\n }\n\n private setupStream(\n stream: ReadableStream<string>,\n wrapper: HTMLElement,\n highlighter: DiffsHighlighter\n ): void {\n const {\n disableLineNumbers = false,\n overflow = 'scroll',\n theme = DEFAULT_THEMES,\n themeType = 'system',\n } = this.options;\n const fileContainer = this.getOrCreateFileContainer();\n if (fileContainer.parentElement == null) {\n wrapper.appendChild(fileContainer);\n }\n this.pre ??= document.createElement('pre');\n if (this.pre.parentElement == null) {\n fileContainer.shadowRoot?.appendChild(this.pre);\n }\n const baseThemeType =\n typeof theme === 'string' ? highlighter.getTheme(theme).type : undefined;\n const themeStyles = getHighlighterThemeStyles({ theme, highlighter });\n this.applyThemeState(fileContainer, themeStyles, themeType, baseThemeType);\n const pre = setPreNodeProperties(this.pre, {\n type: 'file',\n diffIndicators: 'none',\n disableBackground: true,\n disableLineNumbers,\n overflow,\n split: false,\n totalLines: 0,\n });\n pre.textContent = '';\n\n this.pre = pre;\n this.code = getOrCreateCodeNode({ code: this.code, pre });\n this.gutterElement = undefined;\n this.contentElement = undefined;\n this.currentRowCount = 0;\n this.currentLineElement = undefined;\n this.currentLineIndex = this.options.startingLineIndex ?? 1;\n this.abortController?.abort();\n this.abortController = new AbortController();\n const { onStreamStart, onStreamClose, onStreamAbort } = this.options;\n // Cancel the prior source so upstream producers stop generating tokens.\n // Swallow AbortError / locked-stream rejections since we're tearing down.\n this.stream?.cancel().catch(() => {});\n this.stream = stream;\n this.stream\n // tokenizeTimeLimit: 0 — never trade silently-wrong token colors for\n // latency; see renderFileWithHighlighter for the full rationale.\n .pipeThrough(\n typeof theme === 'string'\n ? new CodeToTokenTransformStream({\n ...this.options,\n theme,\n highlighter,\n allowRecalls: true,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n tokenizeTimeLimit: 0,\n })\n : new CodeToTokenTransformStream({\n ...this.options,\n themes: theme,\n highlighter,\n allowRecalls: true,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n tokenizeTimeLimit: 0,\n })\n )\n .pipeTo(\n new WritableStream({\n start(controller) {\n onStreamStart?.(controller);\n },\n close() {\n onStreamClose?.();\n },\n abort(reason) {\n onStreamAbort?.(reason);\n },\n write: this.handleWrite,\n }),\n { signal: this.abortController.signal }\n )\n .catch((error) => {\n // Ignore AbortError - it's expected when cleaning up\n if (error.name !== 'AbortError') {\n console.error('FileStream pipe error:', error);\n }\n });\n }\n\n private queuedTokens: (ThemedToken | RecallToken)[] = [];\n private handleWrite = (token: ThemedToken | RecallToken) => {\n // If we've recalled tokens we haven't rendered yet, we can just yeet them\n // and never apply them\n if ('recall' in token && this.queuedTokens.length >= token.recall) {\n this.queuedTokens.length = this.queuedTokens.length - token.recall;\n } else {\n this.queuedTokens.push(token);\n }\n queueRender(this.render);\n this.options.onStreamWrite?.(token);\n };\n\n private currentLineIndex: number;\n private currentLineElement: HTMLElement | undefined;\n private render = () => {\n this.options.onPreRender?.(this);\n const { gutter, content } = this.getOrCreateStreamColumns();\n const gutterFragment = document.createDocumentFragment();\n const contentFragment = document.createDocumentFragment();\n for (const token of this.queuedTokens) {\n if ('recall' in token) {\n if (this.currentLineElement == null) {\n throw new Error(\n 'FileStream.render: no current line element, shouldnt be possible to get here'\n );\n }\n if (token.recall > this.currentLineElement.childNodes.length) {\n throw new Error(\n `FileStream.render: Token recall exceed the current line, there's probably a bug...`\n );\n }\n for (let i = 0; i < token.recall; i++) {\n this.currentLineElement.lastChild?.remove();\n }\n } else {\n const span = createSpanFromToken(token);\n if (this.currentLineElement == null) {\n const { gutterLine, contentLine } = this.createLine();\n gutterFragment.appendChild(gutterLine);\n contentFragment.appendChild(contentLine);\n }\n this.currentLineElement?.appendChild(span);\n if (token.content === '\\n') {\n this.currentLineIndex++;\n const { gutterLine, contentLine } = this.createLine();\n gutterFragment.appendChild(gutterLine);\n contentFragment.appendChild(contentLine);\n }\n }\n }\n if (gutterFragment.childNodes.length > 0) {\n gutter.appendChild(gutterFragment);\n }\n if (contentFragment.childNodes.length > 0) {\n content.appendChild(contentFragment);\n }\n this.queuedTokens.length = 0;\n this.options.onPostRender?.(this);\n };\n\n private getOrCreateStreamColumns(): {\n gutter: HTMLElement;\n content: HTMLElement;\n } {\n if (this.code == null) {\n throw new Error('FileStream: expected code element to exist');\n }\n if (this.gutterElement != null && this.contentElement != null) {\n return { gutter: this.gutterElement, content: this.contentElement };\n }\n const gutter = document.createElement('div');\n gutter.dataset.gutter = '';\n const content = document.createElement('div');\n content.dataset.content = '';\n this.code.appendChild(gutter);\n this.code.appendChild(content);\n this.gutterElement = gutter;\n this.contentElement = content;\n return { gutter, content };\n }\n\n private updateRowSpan(): void {\n if (this.gutterElement != null) {\n this.gutterElement.style.gridRow = `span ${this.currentRowCount}`;\n }\n if (this.contentElement != null) {\n this.contentElement.style.gridRow = `span ${this.currentRowCount}`;\n }\n }\n\n private createLine(): { gutterLine: HTMLElement; contentLine: HTMLElement } {\n const lineNumber = this.currentLineIndex;\n const lineIndex = `${lineNumber - 1}`;\n const gutterLine = document.createElement('div');\n gutterLine.dataset.columnNumber = `${lineNumber}`;\n gutterLine.dataset.lineType = 'context';\n gutterLine.dataset.lineIndex = lineIndex;\n\n const numberContent = document.createElement('span');\n numberContent.dataset.lineNumberContent = '';\n numberContent.textContent = `${lineNumber}`;\n gutterLine.appendChild(numberContent);\n\n const contentLine = document.createElement('div');\n contentLine.dataset.line = `${lineNumber}`;\n contentLine.dataset.lineType = 'context';\n contentLine.dataset.lineIndex = lineIndex;\n\n this.currentRowCount += 1;\n this.updateRowSpan();\n this.currentLineElement = contentLine;\n return { gutterLine, contentLine };\n }\n\n private getOrCreateFileContainer(fileContainer?: HTMLElement): HTMLElement {\n if (\n (fileContainer != null && fileContainer === this.fileContainer) ||\n (fileContainer == null && this.fileContainer != null)\n ) {\n return this.fileContainer;\n }\n if (\n this.fileContainer != null &&\n fileContainer != null &&\n fileContainer !== this.fileContainer\n ) {\n this.themeCSSStyle = undefined;\n this.appliedThemeCSS = undefined;\n }\n this.fileContainer =\n fileContainer ?? document.createElement(DIFFS_TAG_NAME);\n return this.fileContainer;\n }\n\n private applyThemeState(\n container: HTMLElement,\n themeStyles: string,\n themeType: ThemeTypes,\n baseThemeType?: 'light' | 'dark'\n ): void {\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n const effectiveThemeType = baseThemeType ?? themeType;\n const currentTheme = this.options.theme ?? DEFAULT_THEMES;\n const theme =\n typeof currentTheme === 'string' ? currentTheme : { ...currentTheme };\n const scrollbarGutter = getMeasuredScrollbarGutter(shadowRoot);\n if (\n this.themeCSSStyle?.parentNode === shadowRoot &&\n this.appliedThemeCSS?.themeStyles === themeStyles &&\n this.appliedThemeCSS.themeType === effectiveThemeType &&\n this.appliedThemeCSS.scrollbarGutter === scrollbarGutter\n ) {\n this.appliedThemeCSS.theme = theme;\n return;\n }\n this.themeCSSStyle = upsertHostThemeStyle({\n shadowRoot,\n currentNode: this.themeCSSStyle,\n themeCSS: wrapThemeCSS(themeStyles, effectiveThemeType, scrollbarGutter),\n });\n this.appliedThemeCSS =\n this.themeCSSStyle != null\n ? {\n theme,\n themeStyles,\n themeType: effectiveThemeType,\n baseThemeType,\n scrollbarGutter,\n }\n : undefined;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { FileContents, FileDiffMetadata, MergeConflictActionPayload, MergeConflictMarkerRow, MergeConflictResolution, PostRenderPhase } from "../types.js";
|
|
2
2
|
import { WorkerPoolManager } from "../worker/WorkerPoolManager.js";
|
|
3
|
-
import "../worker/index.js";
|
|
4
3
|
import { HunksRenderResult } from "../renderers/DiffHunksRenderer.js";
|
|
4
|
+
import { FileDiff, FileDiffOptions, FileDiffRenderProps } from "./FileDiff.js";
|
|
5
5
|
import { MergeConflictDiffAction } from "../utils/parseMergeConflictDiffFromFile.js";
|
|
6
6
|
import { UnresolvedFileHunksRenderer, UnresolvedFileHunksRendererOptions } from "../renderers/UnresolvedFileHunksRenderer.js";
|
|
7
|
-
import { FileDiff, FileDiffOptions, FileDiffRenderProps } from "./FileDiff.js";
|
|
8
7
|
|
|
9
8
|
//#region src/components/UnresolvedFile.d.ts
|
|
10
9
|
type RenderMergeConflictActions<LAnnotation> = (action: MergeConflictDiffAction, instance: UnresolvedFile<LAnnotation>) => HTMLElement | DocumentFragment | null | undefined;
|
|
@@ -49,6 +48,7 @@ declare class UnresolvedFile<LAnnotation = undefined> extends FileDiff<LAnnotati
|
|
|
49
48
|
private conflictActionCache;
|
|
50
49
|
constructor(options?: UnresolvedFileOptions<LAnnotation>, workerManager?: WorkerPoolManager | undefined, isContainerManaged?: boolean);
|
|
51
50
|
setOptions(options: UnresolvedFileOptions<LAnnotation> | undefined): void;
|
|
51
|
+
protected syncInteractionOptions(): void;
|
|
52
52
|
protected createHunksRenderer(options: UnresolvedFileOptions<LAnnotation>): UnresolvedFileHunksRenderer<LAnnotation>;
|
|
53
53
|
protected getHunksRendererOptions(options: UnresolvedFileOptions<LAnnotation>): UnresolvedFileHunksRendererOptions;
|
|
54
54
|
protected applyPreNodeAttributes(pre: HTMLPreElement, result: HunksRenderResult): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UnresolvedFile.d.ts","names":[
|
|
1
|
+
{"version":3,"file":"UnresolvedFile.d.ts","names":[],"sources":["../../src/components/UnresolvedFile.ts"],"mappings":";;;;;;;;KAoCY,0BAAA,iBACV,MAAA,EAAQ,uBAAA,EACR,QAAA,EAAU,cAAA,CAAe,WAAA,MACtB,WAAA,GAAc,gBAAA;AAAA,KAEP,8BAAA,qCAGR,0BAA0B,CAAC,WAAA;AAAA,UAEd,qBAAA,sBAA2C,IAAA,CAC1D,eAAA,CAAgB,WAAA;EAGhB,YAAA,EACE,IAAA,EAAM,WAAA,EACN,QAAA,EAAU,cAAA,CAAe,WAAA,GACzB,KAAA,EAAO,eAAA;EAET,wBAAA,GAA2B,8BAAA,CAA+B,WAAA;EAC1D,qBAAA,EACE,OAAA,EAAS,0BAAA,EACT,QAAA,EAAU,cAAA,CAAe,WAAA;EAE3B,sBAAA,EACE,IAAA,EAAM,YAAA,EACN,OAAA,EAAS,0BAAA;EAEX,eAAA;AAAA;AAAA,UAGe,yBAAA,sBAA+C,IAAA,CAC9D,mBAAA,CAAoB,WAAA;EAGpB,IAAA,GAAO,YAAA;EACP,OAAA,IAAW,uBAAA;EACX,UAAA,GAAa,sBAAA;AAAA;AAAA,UAGE,4BAAA,sBAAkD,IAAA,CACjE,yBAAA,CAA0B,WAAA;EAG1B,IAAA,GAAO,YAAA;EACP,aAAA,EAAe,WAAA;EACf,eAAA;AAAA;AAAA,UAQQ,qBAAA;EACR,IAAA,EAAM,YAAA;EACN,QAAA,EAAU,gBAAA;EACV,OAAA,GAAU,uBAAA;EACV,UAAA,EAAY,sBAAA;AAAA;AAAA,UASJ,qBAAA;EACR,IAAA,EAAM,YAAA;EACN,QAAA,EAAU,gBAAA;EACV,OAAA,GAAU,uBAAA;EACV,UAAA,EAAY,sBAAA;AAAA;AAAA,KAGT,uBAAA,GAA0B,qBAAqB;AAAA,cAIvC,cAAA,kCAEH,QAAA,CAAS,WAAA;EAgBC,OAAA,EAAS,qBAAA,CAAsB,WAAA;EAAA,SAf/B,IAAA;EAAA,SACA,IAAA;EAAA,UAER,aAAA,EAAe,uBAAA;EAAA,QAMjB,eAAA;EAAA,QACA,UAAA;EAAA,QACA,mBAAA;EAGR,WAAA,CACkB,OAAA,GAAS,qBAAA,CAAsB,WAAA,GAG/C,aAAA,GAAgB,iBAAA,cAChB,kBAAA;EAMO,UAAA,CACP,OAAA,EAAS,qBAAA,CAAsB,WAAA;EAAA,UAyBd,sBAAA;EAAA,UAeA,mBAAA,CACjB,OAAA,EAAS,qBAAA,CAAsB,WAAA,IAC9B,2BAAA,CAA4B,WAAA;EAAA,UASZ,uBAAA,CACjB,OAAA,EAAS,qBAAA,CAAsB,WAAA,IAC9B,kCAAA;EAAA,UAIgB,sBAAA,CACjB,GAAA,EAAK,cAAA,EACL,MAAA,EAAQ,iBAAA;EAOD,OAAA;EAAA,QAaD,gBAAA;EA6HC,OAAA,CAAQ,KAAA,EAAO,4BAAA,CAA6B,WAAA;EA8C5C,QAAA;EAOA,MAAA,CAAO,KAAA,GAAO,yBAAA,CAA0B,WAAA;EAmC1C,eAAA,CACL,aAAA,UACA,UAAA,EAAY,uBAAA,EACZ,QAAA,GAAU,gBAAA,eACT,qBAAA;EAAA,QA+BK,wBAAA;EAAA,QA+CA,2BAAA;EAAA,QAkBA,8BAAA;EAAA,QAwBA,8BAAA;EAAA,QA+DA,yBAAA;EAAA,QAyBA,6BAAA;AAAA;AAAA,iBAyNM,qCAAA,cACd,OAAA,GAAU,qBAAA,CAAsB,WAAA,GAChC,WAAA,GAAc,qBAAA,CAAsB,WAAA,IACnC,kCAAA"}
|
|
@@ -9,10 +9,10 @@ import { buildMergeConflictMarkerRows, getMergeConflictActionAnchor, parseMergeC
|
|
|
9
9
|
import { UnresolvedFileHunksRenderer } from "../renderers/UnresolvedFileHunksRenderer.js";
|
|
10
10
|
import { areMergeConflictActionsEqual } from "../utils/areMergeConflictActionsEqual.js";
|
|
11
11
|
import { resolveConflict } from "../utils/resolveConflict.js";
|
|
12
|
-
|
|
13
12
|
//#region src/components/UnresolvedFile.ts
|
|
14
13
|
let instanceId = -1;
|
|
15
14
|
var UnresolvedFile = class extends FileDiff {
|
|
15
|
+
options;
|
|
16
16
|
__id = `unresolved-file:${++instanceId}`;
|
|
17
17
|
type = "unresolved-file";
|
|
18
18
|
computedCache = {
|
|
@@ -34,8 +34,10 @@ var UnresolvedFile = class extends FileDiff {
|
|
|
34
34
|
if (options.onMergeConflictAction != null && options.onMergeConflictResolve != null) throw new Error("UnresolvedFile: onMergeConflictAction and onMergeConflictResolve are mutually exclusive. Use only one callback.");
|
|
35
35
|
this.options = options;
|
|
36
36
|
this.hunksRenderer.setOptions(this.getHunksRendererOptions(options));
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
this.syncInteractionOptions();
|
|
38
|
+
}
|
|
39
|
+
syncInteractionOptions() {
|
|
40
|
+
this.interactionManager.setOptions(pluckInteractionOptions(this.options, typeof this.options.hunkSeparators === "function" || (this.options.hunkSeparators ?? "line-info") === "line-info" || this.options.hunkSeparators === "line-info-basic" ? this.handleExpandHunk : void 0, this.getLineIndex, this.handleMergeConflictActionClick));
|
|
39
41
|
}
|
|
40
42
|
createHunksRenderer(options) {
|
|
41
43
|
return new UnresolvedFileHunksRenderer(this.getHunksRendererOptions(options), this.handleHighlightRender, this.workerManager);
|
|
@@ -148,7 +150,7 @@ var UnresolvedFile = class extends FileDiff {
|
|
|
148
150
|
});
|
|
149
151
|
}
|
|
150
152
|
render(props = {}) {
|
|
151
|
-
|
|
153
|
+
const { file, fileDiff, actions, markerRows, lineAnnotations, preventEmit = false, ...rest } = props;
|
|
152
154
|
const source = this.getOrComputeDiff({
|
|
153
155
|
file,
|
|
154
156
|
fileDiff,
|
|
@@ -394,7 +396,7 @@ function getUnresolvedDiffHunksRendererOptions(options, baseOptions) {
|
|
|
394
396
|
mergeConflictActionsType: typeof options?.mergeConflictActionsType === "function" ? "custom" : options?.mergeConflictActionsType
|
|
395
397
|
};
|
|
396
398
|
}
|
|
397
|
-
|
|
398
399
|
//#endregion
|
|
399
400
|
export { UnresolvedFile, getUnresolvedDiffHunksRendererOptions };
|
|
401
|
+
|
|
400
402
|
//# sourceMappingURL=UnresolvedFile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UnresolvedFile.js","names":["options: UnresolvedFileOptions<LAnnotation>","resolveConflictDiff","payload: MergeConflictActionPayload"],"sources":["../../src/components/UnresolvedFile.ts"],"sourcesContent":["import { DEFAULT_THEMES } from '../constants';\nimport type { MergeConflictActionTarget } from '../managers/InteractionManager';\nimport { pluckInteractionOptions } from '../managers/InteractionManager';\nimport type { HunksRenderResult } from '../renderers/DiffHunksRenderer';\nimport {\n UnresolvedFileHunksRenderer,\n type UnresolvedFileHunksRendererOptions,\n} from '../renderers/UnresolvedFileHunksRenderer';\nimport type {\n FileContents,\n FileDiffMetadata,\n MergeConflictActionPayload,\n MergeConflictMarkerRow,\n MergeConflictRegion,\n MergeConflictResolution,\n PostRenderPhase,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areMergeConflictActionsEqual } from '../utils/areMergeConflictActionsEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { getMergeConflictActionSlotName } from '../utils/getMergeConflictActionSlotName';\nimport {\n buildMergeConflictMarkerRows,\n getMergeConflictActionAnchor,\n type MergeConflictDiffAction,\n parseMergeConflictDiffFromFile,\n} from '../utils/parseMergeConflictDiffFromFile';\nimport { resolveConflict as resolveConflictDiff } from '../utils/resolveConflict';\nimport { splitFileContents } from '../utils/splitFileContents';\nimport type { WorkerPoolManager } from '../worker';\nimport {\n FileDiff,\n type FileDiffOptions,\n type FileDiffRenderProps,\n} from './FileDiff';\n\nexport type RenderMergeConflictActions<LAnnotation> = (\n action: MergeConflictDiffAction,\n instance: UnresolvedFile<LAnnotation>\n) => HTMLElement | DocumentFragment | null | undefined;\n\nexport type MergeConflictActionsTypeOption<LAnnotation> =\n | 'none'\n | 'default'\n | RenderMergeConflictActions<LAnnotation>;\n\nexport interface UnresolvedFileOptions<LAnnotation> extends Omit<\n FileDiffOptions<LAnnotation>,\n 'diffStyle' | 'onPostRender'\n> {\n onPostRender?(\n node: HTMLElement,\n instance: UnresolvedFile<LAnnotation>,\n phase: PostRenderPhase\n ): unknown;\n mergeConflictActionsType?: MergeConflictActionsTypeOption<LAnnotation>;\n onMergeConflictAction?(\n payload: MergeConflictActionPayload,\n instance: UnresolvedFile<LAnnotation>\n ): void;\n onMergeConflictResolve?(\n file: FileContents,\n payload: MergeConflictActionPayload\n ): void;\n maxContextLines?: number;\n}\n\nexport interface UnresolvedFileRenderProps<LAnnotation> extends Omit<\n FileDiffRenderProps<LAnnotation>,\n 'oldFile' | 'newFile'\n> {\n file?: FileContents;\n actions?: (MergeConflictDiffAction | undefined)[];\n markerRows?: MergeConflictMarkerRow[];\n}\n\nexport interface UnresolvedFileHydrationProps<LAnnotation> extends Omit<\n UnresolvedFileRenderProps<LAnnotation>,\n 'file'\n> {\n file?: FileContents;\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\ninterface MergeConflictActionElementCache {\n element: HTMLElement;\n action: MergeConflictDiffAction;\n}\n\ninterface GetOrComputeDiffProps {\n file: FileContents | undefined;\n fileDiff: FileDiffMetadata | undefined;\n actions: (MergeConflictDiffAction | undefined)[] | undefined;\n markerRows: MergeConflictMarkerRow[] | undefined;\n}\n\ninterface GetOrComputeDiffResult {\n fileDiff: FileDiffMetadata;\n actions: (MergeConflictDiffAction | undefined)[];\n markerRows: MergeConflictMarkerRow[];\n}\n\ninterface ResolveConflictReturn {\n file: FileContents;\n fileDiff: FileDiffMetadata;\n actions: (MergeConflictDiffAction | undefined)[];\n markerRows: MergeConflictMarkerRow[];\n}\n\ntype UnresolvedFileDataCache = GetOrComputeDiffProps;\n\nlet instanceId = -1;\n\nexport class UnresolvedFile<\n LAnnotation = undefined,\n> extends FileDiff<LAnnotation> {\n override readonly __id: string = `unresolved-file:${++instanceId}`;\n override readonly type = 'unresolved-file';\n\n protected computedCache: UnresolvedFileDataCache = {\n file: undefined,\n fileDiff: undefined,\n actions: undefined,\n markerRows: undefined,\n };\n private conflictActions: (MergeConflictDiffAction | undefined)[] = [];\n private markerRows: MergeConflictMarkerRow[] = [];\n private conflictActionCache: Map<string, MergeConflictActionElementCache> =\n new Map();\n\n constructor(\n public override options: UnresolvedFileOptions<LAnnotation> = {\n theme: DEFAULT_THEMES,\n },\n workerManager?: WorkerPoolManager | undefined,\n isContainerManaged = false\n ) {\n super(undefined, workerManager, isContainerManaged);\n this.setOptions(options);\n }\n\n override setOptions(\n options: UnresolvedFileOptions<LAnnotation> | undefined\n ): void {\n if (options == null) {\n return;\n }\n\n if (\n options.onMergeConflictAction != null &&\n options.onMergeConflictResolve != null\n ) {\n throw new Error(\n 'UnresolvedFile: onMergeConflictAction and onMergeConflictResolve are mutually exclusive. Use only one callback.'\n );\n }\n\n this.options = options;\n this.hunksRenderer.setOptions(this.getHunksRendererOptions(options));\n\n const hunkSeparators = this.options.hunkSeparators ?? 'line-info';\n this.interactionManager.setOptions(\n pluckInteractionOptions(\n this.options,\n typeof hunkSeparators === 'function' ||\n hunkSeparators === 'line-info' ||\n hunkSeparators === 'line-info-basic'\n ? this.expandHunk\n : undefined,\n this.getLineIndex,\n this.handleMergeConflictActionClick\n )\n );\n }\n\n protected override createHunksRenderer(\n options: UnresolvedFileOptions<LAnnotation>\n ): UnresolvedFileHunksRenderer<LAnnotation> {\n const renderer = new UnresolvedFileHunksRenderer<LAnnotation>(\n this.getHunksRendererOptions(options),\n this.handleHighlightRender,\n this.workerManager\n );\n return renderer;\n }\n\n protected override getHunksRendererOptions(\n options: UnresolvedFileOptions<LAnnotation>\n ): UnresolvedFileHunksRendererOptions {\n return getUnresolvedDiffHunksRendererOptions(options, this.options);\n }\n\n protected override applyPreNodeAttributes(\n pre: HTMLPreElement,\n result: HunksRenderResult\n ): void {\n super.applyPreNodeAttributes(pre, result, {\n 'data-has-merge-conflict': '',\n });\n }\n\n override cleanUp(): void {\n this.emitPostRender(true);\n this.clearMergeConflictActionCache();\n this.computedCache = {\n file: undefined,\n fileDiff: undefined,\n actions: undefined,\n markerRows: undefined,\n };\n this.conflictActions = [];\n super.cleanUp();\n }\n\n private getOrComputeDiff({\n file,\n fileDiff,\n actions,\n markerRows,\n }: GetOrComputeDiffProps): GetOrComputeDiffResult | undefined {\n const { maxContextLines, onMergeConflictAction } = this.options;\n wrapper: {\n // We are dealing with a controlled component\n if (onMergeConflictAction != null) {\n const hasFileDiff = fileDiff != null;\n const hasActions = actions != null;\n const hasMarkerRows = markerRows != null;\n if (hasFileDiff !== hasActions || hasFileDiff !== hasMarkerRows) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: fileDiff, actions, and markerRows must be passed together'\n );\n }\n // If we were provided a new fileDiff/actions/markerRows, we are a FULLY\n // controlled component, which means we will not do any computation\n if (fileDiff != null && actions != null && markerRows != null) {\n this.computedCache = {\n file: file ?? this.computedCache.file,\n fileDiff,\n actions,\n markerRows,\n };\n break wrapper;\n }\n // If we were provided a new file, we should attempt to parse out a new\n // diff/actions if we haven't computed it before. Once we initialize from\n // a file, later updates must flow through fileDiff/actions instead of\n // reparsing from a new file input.\n else if (file != null || this.computedCache.file != null) {\n if (\n file != null &&\n this.computedCache.file != null &&\n !areFilesEqual(file, this.computedCache.file) &&\n this.computedCache.fileDiff != null &&\n this.computedCache.actions != null\n ) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: file can only be used to initialize unresolved state once. Pass fileDiff and actions for subsequent updates.'\n );\n }\n file ??= this.computedCache.file;\n if (file == null) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: file is null, should be impossible'\n );\n }\n if (\n !areFilesEqual(file, this.computedCache.file) ||\n this.computedCache.fileDiff == null ||\n this.computedCache.actions == null\n ) {\n const computed = parseMergeConflictDiffFromFile(\n file,\n maxContextLines\n );\n this.computedCache = {\n file,\n fileDiff: computed.fileDiff,\n actions: computed.actions,\n markerRows: computed.markerRows,\n };\n }\n fileDiff = this.computedCache.fileDiff;\n actions = this.computedCache.actions;\n markerRows = this.computedCache.markerRows;\n break wrapper;\n }\n // Otherwise we should fall through and try to use the cache if it exists\n else {\n fileDiff = this.computedCache.fileDiff;\n actions = this.computedCache.actions;\n markerRows = this.computedCache.markerRows;\n break wrapper;\n }\n }\n // If we are uncontrolled we only rely on the file and only use the first\n // version. After that, the cached diff/action pair is the source of\n // truth and we should not accept a new file input.\n else {\n if (fileDiff != null || actions != null || markerRows != null) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: fileDiff, actions, and markerRows are only usable in controlled mode, you must pass in `onMergeConflictAction`'\n );\n }\n if (\n file != null &&\n this.computedCache.file != null &&\n !areFilesEqual(file, this.computedCache.file)\n ) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: uncontrolled unresolved files parse the file only once. Later updates must come from the cached diff state.'\n );\n }\n this.computedCache.file ??= file;\n if (\n this.computedCache.fileDiff == null &&\n this.computedCache.file != null\n ) {\n const computed = parseMergeConflictDiffFromFile(\n this.computedCache.file,\n maxContextLines\n );\n this.computedCache.fileDiff = computed.fileDiff;\n this.computedCache.actions = computed.actions;\n this.computedCache.markerRows = computed.markerRows;\n }\n // Because we are uncontrolled, the source of truth is the\n // computedCache\n fileDiff = this.computedCache.fileDiff;\n actions = this.computedCache.actions;\n markerRows = this.computedCache.markerRows;\n break wrapper;\n }\n }\n if (fileDiff == null || actions == null || markerRows == null) {\n return undefined;\n }\n return { fileDiff, actions, markerRows };\n }\n\n override hydrate(props: UnresolvedFileHydrationProps<LAnnotation>): void {\n const {\n file,\n fileDiff,\n actions,\n markerRows,\n lineAnnotations,\n fileContainer,\n prerenderedHTML,\n preventEmit = false,\n } = props;\n const source = this.getOrComputeDiff({\n file,\n fileDiff,\n actions,\n markerRows,\n });\n if (source == null) {\n return;\n }\n this.hydrateElements(fileContainer, prerenderedHTML);\n this.setActiveMergeConflictState(source.actions, source.markerRows);\n // If necessary hydration elements don't exist, we should assume a full\n // render\n if (\n shouldRenderCode(this.pre, source.fileDiff, this.options.collapsed) ||\n shouldRenderHeader(\n this.headerElement,\n source.fileDiff,\n this.options.disableFileHeader\n )\n ) {\n this.render({ ...props, preventEmit: true });\n }\n // Otherwise orchestrate our setup\n else {\n this.hydrationSetup({ fileDiff: source.fileDiff, lineAnnotations });\n if (this.pre != null) {\n this.renderMergeConflictActionSlots();\n }\n }\n if (!preventEmit) {\n this.emitPostRender();\n }\n }\n\n override rerender(): void {\n if (!this.enabled || this.fileDiff == null) {\n return;\n }\n this.render({ forceRender: true, renderRange: this.renderRange });\n }\n\n override render(props: UnresolvedFileRenderProps<LAnnotation> = {}): boolean {\n let {\n file,\n fileDiff,\n actions,\n markerRows,\n lineAnnotations,\n preventEmit = false,\n ...rest\n } = props;\n const source = this.getOrComputeDiff({\n file,\n fileDiff,\n actions,\n markerRows,\n });\n if (source == null) {\n return false;\n }\n this.setActiveMergeConflictState(source.actions, source.markerRows);\n const didRender = super.render({\n ...rest,\n fileDiff: source.fileDiff,\n lineAnnotations,\n preventEmit: true,\n });\n if (didRender) {\n this.renderMergeConflictActionSlots();\n if (!preventEmit) {\n this.emitPostRender();\n }\n }\n return didRender;\n }\n\n public resolveConflict(\n conflictIndex: number,\n resolution: MergeConflictResolution,\n fileDiff: FileDiffMetadata | undefined = this.computedCache.fileDiff\n ): ResolveConflictReturn | undefined {\n const action = this.conflictActions[conflictIndex];\n if (fileDiff == null || action == null) {\n return undefined;\n }\n\n if (action.conflictIndex !== conflictIndex) {\n console.error({ conflictIndex, action });\n throw new Error(\n \"UnresolvedFile.resolveConflict: conflictIndex and conflictAction don't match\"\n );\n }\n\n const newFileDiff = resolveConflictDiff(fileDiff, action, resolution);\n const previousFile = this.computedCache.file;\n const { file, actions, markerRows } = rebuildFileAndActions({\n fileDiff: newFileDiff,\n previousActions: this.conflictActions,\n resolvedConflictIndex: conflictIndex,\n previousFile,\n resolution,\n });\n\n return {\n file,\n fileDiff: newFileDiff,\n actions,\n markerRows,\n };\n }\n\n private resolveConflictAndRender(\n conflictIndex: number,\n resolution: MergeConflictResolution\n ): void {\n const action = this.conflictActions[conflictIndex];\n if (action == null) {\n return;\n }\n if (action.conflictIndex !== conflictIndex) {\n console.error({ conflictIndex, action });\n throw new Error(\n \"UnresolvedFile.resolveConflictAndRender: conflictIndex and conflictAction don't match\"\n );\n }\n const payload: MergeConflictActionPayload = {\n resolution,\n conflict: action.conflict,\n };\n const { file, fileDiff, actions, markerRows } =\n this.resolveConflict(conflictIndex, resolution) ?? {};\n if (\n file == null ||\n fileDiff == null ||\n actions == null ||\n markerRows == null\n ) {\n return;\n }\n\n this.computedCache = { file, fileDiff, actions, markerRows };\n this.setActiveMergeConflictState(actions, markerRows);\n // NOTE(amadeus): This is a bit jank, but helps to ensure we don't see a\n // bunch of jittery re-renders as things resolve out. In a more perfect\n // world we would have a more elegant way to kick off a render to the\n // highlighter and then resolve actions in a cleaner way, but time is short\n // right now. Can't let perfect be the enemy of good\n if (this.workerManager != null) {\n // Because we are using a workerManager, if we fire off the renderDiff\n // call, it will eventually get back to us in a callback which will\n // trigger a re-render\n this.hunksRenderer.renderDiff(fileDiff);\n } else {\n this.render({ forceRender: true });\n }\n this.options.onMergeConflictResolve?.(file, payload);\n }\n\n private setActiveMergeConflictState(\n actions: (MergeConflictDiffAction | undefined)[] = this.conflictActions,\n markerRows: MergeConflictMarkerRow[] = this.markerRows\n ): void {\n this.conflictActions = actions;\n this.markerRows = markerRows;\n if (\n this.computedCache.fileDiff != null &&\n this.hunksRenderer instanceof UnresolvedFileHunksRenderer\n ) {\n this.hunksRenderer.setConflictState(\n this.options.mergeConflictActionsType === 'none' ? [] : actions,\n markerRows,\n this.computedCache.fileDiff\n );\n }\n }\n\n private handleMergeConflictActionClick = (\n target: MergeConflictActionTarget\n ): void => {\n const action = this.conflictActions[target.conflictIndex];\n if (action == null) {\n return;\n }\n if (action.conflictIndex !== target.conflictIndex) {\n console.error({ conflictIndex: target.conflictIndex, action });\n throw new Error(\n \"UnresolvedFile.handleMergeConflictActionClick: conflictIndex and conflictAction don't match\"\n );\n }\n const payload: MergeConflictActionPayload = {\n resolution: target.resolution,\n conflict: action.conflict,\n };\n if (this.options.onMergeConflictAction != null) {\n this.options.onMergeConflictAction(payload, this);\n return;\n }\n this.resolveConflictAndRender(target.conflictIndex, target.resolution);\n };\n\n private renderMergeConflictActionSlots(): void {\n const { fileDiff } = this.computedCache;\n if (\n this.isContainerManaged ||\n this.fileContainer == null ||\n typeof this.options.mergeConflictActionsType !== 'function' ||\n this.conflictActions.length === 0 ||\n fileDiff == null\n ) {\n this.clearMergeConflictActionCache();\n return;\n }\n const staleActions = new Map(this.conflictActionCache);\n for (\n let actionIndex = 0;\n actionIndex < this.conflictActions.length;\n actionIndex++\n ) {\n const action = this.conflictActions[actionIndex];\n if (action == null) {\n continue;\n }\n if (action.conflictIndex !== actionIndex) {\n console.error({ conflictIndex: actionIndex, action });\n throw new Error(\n \"UnresolvedFile.renderMergeConflictActionSlots: conflictIndex and conflictAction don't match\"\n );\n }\n const anchor = getMergeConflictActionAnchor(action, fileDiff);\n if (anchor == null) {\n continue;\n }\n const conflictIndex = action.conflictIndex;\n const slotName = getMergeConflictActionSlotName({\n hunkIndex: anchor.hunkIndex,\n lineIndex: anchor.lineIndex,\n conflictIndex,\n });\n const id = `${actionIndex}-${slotName}`;\n let cache = this.conflictActionCache.get(id);\n if (\n cache == null ||\n !areMergeConflictActionsEqual(cache.action, action)\n ) {\n cache?.element.remove();\n const rendered = this.renderMergeConflictAction(action);\n if (rendered == null) {\n continue;\n }\n const element = createAnnotationWrapperNode(slotName);\n element.appendChild(rendered);\n this.fileContainer.appendChild(element);\n cache = { element, action };\n this.conflictActionCache.set(id, cache);\n }\n staleActions.delete(id);\n }\n for (const [id, { element }] of staleActions.entries()) {\n this.conflictActionCache.delete(id);\n element.remove();\n }\n }\n\n private renderMergeConflictAction(\n action: MergeConflictDiffAction\n ): HTMLElement | undefined {\n if (typeof this.options.mergeConflictActionsType !== 'function') {\n return undefined;\n }\n const rendered = this.options.mergeConflictActionsType(action, this);\n if (rendered == null) {\n return undefined;\n }\n if (rendered instanceof HTMLElement) {\n return rendered;\n }\n if (\n typeof DocumentFragment !== 'undefined' &&\n rendered instanceof DocumentFragment\n ) {\n const wrapper = document.createElement('div');\n wrapper.style.display = 'contents';\n wrapper.appendChild(rendered);\n return wrapper;\n }\n return undefined;\n }\n\n private clearMergeConflictActionCache(): void {\n for (const { element } of this.conflictActionCache.values()) {\n element.remove();\n }\n this.conflictActionCache.clear();\n }\n}\n\ninterface RebuildFileAndActionsProps {\n fileDiff: FileDiffMetadata;\n previousActions: (MergeConflictDiffAction | undefined)[];\n resolvedConflictIndex: number;\n // FIXME: Probably should remove this...\n // additionOffset: number;\n // deletionOffset: number;\n previousFile: FileContents | undefined;\n resolution: MergeConflictResolution;\n}\n\n// Rebuild the emitted unresolved file contents and remaining action anchors in\n// one pass over the post-resolution diff state.\nfunction rebuildFileAndActions({\n fileDiff,\n previousActions,\n resolvedConflictIndex,\n previousFile,\n resolution,\n}: RebuildFileAndActionsProps): Pick<\n ResolveConflictReturn,\n 'file' | 'actions' | 'markerRows'\n> {\n const resolvedAction = previousActions[resolvedConflictIndex];\n if (resolvedAction == null) {\n throw new Error(\n 'rebuildFileAndActions: missing resolved action for unresolved file rebuild'\n );\n }\n\n const actions = updateConflictActionsAfterResolution(\n previousActions,\n resolvedConflictIndex,\n resolvedAction,\n resolution\n );\n const markerRows = buildMergeConflictMarkerRows(fileDiff, actions);\n\n const file = rebuildUnresolvedFile({\n fileDiff,\n resolvedAction,\n resolvedConflictIndex,\n previousFile,\n resolution,\n });\n\n return {\n file,\n actions,\n markerRows,\n };\n}\n\ninterface RebuildUnresolvedFileProps {\n fileDiff: FileDiffMetadata;\n resolvedAction: MergeConflictDiffAction;\n resolvedConflictIndex: number;\n previousFile: FileContents | undefined;\n resolution: MergeConflictResolution;\n}\n\n// Rebuild the unresolved file text from the previous unresolved source so we\n// preserve remaining marker blocks exactly while the diff state stays in-place.\nfunction rebuildUnresolvedFile({\n resolvedAction,\n resolvedConflictIndex,\n previousFile,\n fileDiff,\n resolution,\n}: RebuildUnresolvedFileProps): FileContents {\n const previousContents = previousFile?.contents ?? '';\n const lines = splitFileContents(previousContents);\n const { conflict } = resolvedAction;\n const replacementLines = getResolvedConflictReplacementLines(\n lines,\n conflict,\n resolution\n );\n const contents = [\n ...lines.slice(0, conflict.startLineIndex),\n ...replacementLines,\n ...lines.slice(conflict.endLineIndex + 1),\n ].join('');\n\n return {\n name: previousFile?.name ?? fileDiff.name,\n contents,\n cacheKey:\n previousFile?.cacheKey != null\n ? `${previousFile.cacheKey}:mc-${resolvedConflictIndex}-${resolution}`\n : undefined,\n };\n}\n\nfunction getResolvedConflictReplacementLines(\n lines: string[],\n conflict: MergeConflictDiffAction['conflict'],\n resolution: MergeConflictResolution\n): string[] {\n const currentLines = lines.slice(\n conflict.startLineIndex + 1,\n conflict.baseMarkerLineIndex ?? conflict.separatorLineIndex\n );\n const incomingLines = lines.slice(\n conflict.separatorLineIndex + 1,\n conflict.endLineIndex\n );\n\n if (resolution === 'current') {\n return currentLines;\n }\n if (resolution === 'incoming') {\n return incomingLines;\n }\n return [...currentLines, ...incomingLines];\n}\n\n// The diff resolver keeps hunk/content group indexes stable, so the only\n// follow-up update we need here is shifting unresolved source-region line\n// numbers for later conflicts in the rebuilt file text.\nfunction updateConflictActionsAfterResolution(\n previousActions: (MergeConflictDiffAction | undefined)[],\n resolvedConflictIndex: number,\n resolvedAction: MergeConflictDiffAction,\n resolution: MergeConflictResolution\n): (MergeConflictDiffAction | undefined)[] {\n const lineDelta = getResolvedConflictLineDelta(\n resolvedAction.conflict,\n resolution\n );\n\n return previousActions.map((action, index) => {\n if (index === resolvedConflictIndex) {\n return undefined;\n }\n if (action == null) {\n return undefined;\n }\n if (action.conflict.startLineIndex > resolvedAction.conflict.endLineIndex) {\n return {\n ...action,\n conflict: shiftMergeConflictRegion(action.conflict, lineDelta),\n };\n }\n return action;\n });\n}\n\nfunction getResolvedConflictLineDelta(\n conflict: MergeConflictRegion,\n resolution: MergeConflictResolution\n): number {\n const currentLineCount =\n (conflict.baseMarkerLineIndex ?? conflict.separatorLineIndex) -\n conflict.startLineIndex -\n 1;\n const incomingLineCount =\n conflict.endLineIndex - conflict.separatorLineIndex - 1;\n const replacementLineCount =\n resolution === 'current'\n ? currentLineCount\n : resolution === 'incoming'\n ? incomingLineCount\n : currentLineCount + incomingLineCount;\n const conflictLineCount = conflict.endLineIndex - conflict.startLineIndex + 1;\n return replacementLineCount - conflictLineCount;\n}\n\nfunction shiftMergeConflictRegion(\n conflict: MergeConflictRegion,\n lineDelta: number\n): MergeConflictRegion {\n return {\n ...conflict,\n startLineIndex: conflict.startLineIndex + lineDelta,\n startLineNumber: conflict.startLineNumber + lineDelta,\n separatorLineIndex: conflict.separatorLineIndex + lineDelta,\n separatorLineNumber: conflict.separatorLineNumber + lineDelta,\n endLineIndex: conflict.endLineIndex + lineDelta,\n endLineNumber: conflict.endLineNumber + lineDelta,\n baseMarkerLineIndex:\n conflict.baseMarkerLineIndex != null\n ? conflict.baseMarkerLineIndex + lineDelta\n : undefined,\n baseMarkerLineNumber:\n conflict.baseMarkerLineNumber != null\n ? conflict.baseMarkerLineNumber + lineDelta\n : undefined,\n };\n}\n\nfunction shouldRenderCode(\n pre: HTMLPreElement | undefined,\n fileDiff: FileDiffMetadata | undefined,\n collapsed = false\n): boolean {\n return !collapsed && pre == null && fileDiff != null;\n}\n\nfunction shouldRenderHeader(\n headerElement: HTMLElement | undefined,\n fileDiff: FileDiffMetadata | undefined,\n disableFileHeader = false\n): boolean {\n return headerElement == null && fileDiff != null && !disableFileHeader;\n}\n\n// NOTE(amadeus): Should probably pull this out into a util, and make variants\n// for all component types\nexport function getUnresolvedDiffHunksRendererOptions<LAnnotation>(\n options?: UnresolvedFileOptions<LAnnotation>,\n baseOptions?: UnresolvedFileOptions<LAnnotation>\n): UnresolvedFileHunksRendererOptions {\n return {\n ...baseOptions,\n ...options,\n hunkSeparators:\n typeof options?.hunkSeparators === 'function'\n ? 'custom'\n : options?.hunkSeparators,\n mergeConflictActionsType:\n typeof options?.mergeConflictActionsType === 'function'\n ? 'custom'\n : options?.mergeConflictActionsType,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UnresolvedFile.js","names":["resolveConflictDiff"],"sources":["../../src/components/UnresolvedFile.ts"],"sourcesContent":["import { DEFAULT_THEMES } from '../constants';\nimport type { MergeConflictActionTarget } from '../managers/InteractionManager';\nimport { pluckInteractionOptions } from '../managers/InteractionManager';\nimport type { HunksRenderResult } from '../renderers/DiffHunksRenderer';\nimport {\n UnresolvedFileHunksRenderer,\n type UnresolvedFileHunksRendererOptions,\n} from '../renderers/UnresolvedFileHunksRenderer';\nimport type {\n FileContents,\n FileDiffMetadata,\n MergeConflictActionPayload,\n MergeConflictMarkerRow,\n MergeConflictRegion,\n MergeConflictResolution,\n PostRenderPhase,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areMergeConflictActionsEqual } from '../utils/areMergeConflictActionsEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { getMergeConflictActionSlotName } from '../utils/getMergeConflictActionSlotName';\nimport {\n buildMergeConflictMarkerRows,\n getMergeConflictActionAnchor,\n type MergeConflictDiffAction,\n parseMergeConflictDiffFromFile,\n} from '../utils/parseMergeConflictDiffFromFile';\nimport { resolveConflict as resolveConflictDiff } from '../utils/resolveConflict';\nimport { splitFileContents } from '../utils/splitFileContents';\nimport type { WorkerPoolManager } from '../worker';\nimport {\n FileDiff,\n type FileDiffOptions,\n type FileDiffRenderProps,\n} from './FileDiff';\n\nexport type RenderMergeConflictActions<LAnnotation> = (\n action: MergeConflictDiffAction,\n instance: UnresolvedFile<LAnnotation>\n) => HTMLElement | DocumentFragment | null | undefined;\n\nexport type MergeConflictActionsTypeOption<LAnnotation> =\n | 'none'\n | 'default'\n | RenderMergeConflictActions<LAnnotation>;\n\nexport interface UnresolvedFileOptions<LAnnotation> extends Omit<\n FileDiffOptions<LAnnotation>,\n 'diffStyle' | 'onPostRender'\n> {\n onPostRender?(\n node: HTMLElement,\n instance: UnresolvedFile<LAnnotation>,\n phase: PostRenderPhase\n ): unknown;\n mergeConflictActionsType?: MergeConflictActionsTypeOption<LAnnotation>;\n onMergeConflictAction?(\n payload: MergeConflictActionPayload,\n instance: UnresolvedFile<LAnnotation>\n ): void;\n onMergeConflictResolve?(\n file: FileContents,\n payload: MergeConflictActionPayload\n ): void;\n maxContextLines?: number;\n}\n\nexport interface UnresolvedFileRenderProps<LAnnotation> extends Omit<\n FileDiffRenderProps<LAnnotation>,\n 'oldFile' | 'newFile'\n> {\n file?: FileContents;\n actions?: (MergeConflictDiffAction | undefined)[];\n markerRows?: MergeConflictMarkerRow[];\n}\n\nexport interface UnresolvedFileHydrationProps<LAnnotation> extends Omit<\n UnresolvedFileRenderProps<LAnnotation>,\n 'file'\n> {\n file?: FileContents;\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\ninterface MergeConflictActionElementCache {\n element: HTMLElement;\n action: MergeConflictDiffAction;\n}\n\ninterface GetOrComputeDiffProps {\n file: FileContents | undefined;\n fileDiff: FileDiffMetadata | undefined;\n actions: (MergeConflictDiffAction | undefined)[] | undefined;\n markerRows: MergeConflictMarkerRow[] | undefined;\n}\n\ninterface GetOrComputeDiffResult {\n fileDiff: FileDiffMetadata;\n actions: (MergeConflictDiffAction | undefined)[];\n markerRows: MergeConflictMarkerRow[];\n}\n\ninterface ResolveConflictReturn {\n file: FileContents;\n fileDiff: FileDiffMetadata;\n actions: (MergeConflictDiffAction | undefined)[];\n markerRows: MergeConflictMarkerRow[];\n}\n\ntype UnresolvedFileDataCache = GetOrComputeDiffProps;\n\nlet instanceId = -1;\n\nexport class UnresolvedFile<\n LAnnotation = undefined,\n> extends FileDiff<LAnnotation> {\n override readonly __id: string = `unresolved-file:${++instanceId}`;\n override readonly type = 'unresolved-file';\n\n protected computedCache: UnresolvedFileDataCache = {\n file: undefined,\n fileDiff: undefined,\n actions: undefined,\n markerRows: undefined,\n };\n private conflictActions: (MergeConflictDiffAction | undefined)[] = [];\n private markerRows: MergeConflictMarkerRow[] = [];\n private conflictActionCache: Map<string, MergeConflictActionElementCache> =\n new Map();\n\n constructor(\n public override options: UnresolvedFileOptions<LAnnotation> = {\n theme: DEFAULT_THEMES,\n },\n workerManager?: WorkerPoolManager | undefined,\n isContainerManaged = false\n ) {\n super(undefined, workerManager, isContainerManaged);\n this.setOptions(options);\n }\n\n override setOptions(\n options: UnresolvedFileOptions<LAnnotation> | undefined\n ): void {\n if (options == null) {\n return;\n }\n\n if (\n options.onMergeConflictAction != null &&\n options.onMergeConflictResolve != null\n ) {\n throw new Error(\n 'UnresolvedFile: onMergeConflictAction and onMergeConflictResolve are mutually exclusive. Use only one callback.'\n );\n }\n\n this.options = options;\n this.hunksRenderer.setOptions(this.getHunksRendererOptions(options));\n this.syncInteractionOptions();\n }\n\n // UnresolvedFile adds a merge-conflict-action click handler to the\n // InteractionManager. FileDiff.syncInteractionOptions() re-runs on every\n // re-render and during hydration; without this override it would rebuild the\n // interaction options without that handler, so resolving one conflict (which\n // re-renders the diff) would silently disable every remaining action button.\n protected override syncInteractionOptions(): void {\n this.interactionManager.setOptions(\n pluckInteractionOptions(\n this.options,\n typeof this.options.hunkSeparators === 'function' ||\n (this.options.hunkSeparators ?? 'line-info') === 'line-info' ||\n this.options.hunkSeparators === 'line-info-basic'\n ? this.handleExpandHunk\n : undefined,\n this.getLineIndex,\n this.handleMergeConflictActionClick\n )\n );\n }\n\n protected override createHunksRenderer(\n options: UnresolvedFileOptions<LAnnotation>\n ): UnresolvedFileHunksRenderer<LAnnotation> {\n const renderer = new UnresolvedFileHunksRenderer<LAnnotation>(\n this.getHunksRendererOptions(options),\n this.handleHighlightRender,\n this.workerManager\n );\n return renderer;\n }\n\n protected override getHunksRendererOptions(\n options: UnresolvedFileOptions<LAnnotation>\n ): UnresolvedFileHunksRendererOptions {\n return getUnresolvedDiffHunksRendererOptions(options, this.options);\n }\n\n protected override applyPreNodeAttributes(\n pre: HTMLPreElement,\n result: HunksRenderResult\n ): void {\n super.applyPreNodeAttributes(pre, result, {\n 'data-has-merge-conflict': '',\n });\n }\n\n override cleanUp(): void {\n this.emitPostRender(true);\n this.clearMergeConflictActionCache();\n this.computedCache = {\n file: undefined,\n fileDiff: undefined,\n actions: undefined,\n markerRows: undefined,\n };\n this.conflictActions = [];\n super.cleanUp();\n }\n\n private getOrComputeDiff({\n file,\n fileDiff,\n actions,\n markerRows,\n }: GetOrComputeDiffProps): GetOrComputeDiffResult | undefined {\n const { maxContextLines, onMergeConflictAction } = this.options;\n wrapper: {\n // We are dealing with a controlled component\n if (onMergeConflictAction != null) {\n const hasFileDiff = fileDiff != null;\n const hasActions = actions != null;\n const hasMarkerRows = markerRows != null;\n if (hasFileDiff !== hasActions || hasFileDiff !== hasMarkerRows) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: fileDiff, actions, and markerRows must be passed together'\n );\n }\n // If we were provided a new fileDiff/actions/markerRows, we are a FULLY\n // controlled component, which means we will not do any computation\n if (fileDiff != null && actions != null && markerRows != null) {\n this.computedCache = {\n file: file ?? this.computedCache.file,\n fileDiff,\n actions,\n markerRows,\n };\n break wrapper;\n }\n // If we were provided a new file, we should attempt to parse out a new\n // diff/actions if we haven't computed it before. Once we initialize from\n // a file, later updates must flow through fileDiff/actions instead of\n // reparsing from a new file input.\n else if (file != null || this.computedCache.file != null) {\n if (\n file != null &&\n this.computedCache.file != null &&\n !areFilesEqual(file, this.computedCache.file) &&\n this.computedCache.fileDiff != null &&\n this.computedCache.actions != null\n ) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: file can only be used to initialize unresolved state once. Pass fileDiff and actions for subsequent updates.'\n );\n }\n file ??= this.computedCache.file;\n if (file == null) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: file is null, should be impossible'\n );\n }\n if (\n !areFilesEqual(file, this.computedCache.file) ||\n this.computedCache.fileDiff == null ||\n this.computedCache.actions == null\n ) {\n const computed = parseMergeConflictDiffFromFile(\n file,\n maxContextLines\n );\n this.computedCache = {\n file,\n fileDiff: computed.fileDiff,\n actions: computed.actions,\n markerRows: computed.markerRows,\n };\n }\n fileDiff = this.computedCache.fileDiff;\n actions = this.computedCache.actions;\n markerRows = this.computedCache.markerRows;\n break wrapper;\n }\n // Otherwise we should fall through and try to use the cache if it exists\n else {\n fileDiff = this.computedCache.fileDiff;\n actions = this.computedCache.actions;\n markerRows = this.computedCache.markerRows;\n break wrapper;\n }\n }\n // If we are uncontrolled we only rely on the file and only use the first\n // version. After that, the cached diff/action pair is the source of\n // truth and we should not accept a new file input.\n else {\n if (fileDiff != null || actions != null || markerRows != null) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: fileDiff, actions, and markerRows are only usable in controlled mode, you must pass in `onMergeConflictAction`'\n );\n }\n if (\n file != null &&\n this.computedCache.file != null &&\n !areFilesEqual(file, this.computedCache.file)\n ) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: uncontrolled unresolved files parse the file only once. Later updates must come from the cached diff state.'\n );\n }\n this.computedCache.file ??= file;\n if (\n this.computedCache.fileDiff == null &&\n this.computedCache.file != null\n ) {\n const computed = parseMergeConflictDiffFromFile(\n this.computedCache.file,\n maxContextLines\n );\n this.computedCache.fileDiff = computed.fileDiff;\n this.computedCache.actions = computed.actions;\n this.computedCache.markerRows = computed.markerRows;\n }\n // Because we are uncontrolled, the source of truth is the\n // computedCache\n fileDiff = this.computedCache.fileDiff;\n actions = this.computedCache.actions;\n markerRows = this.computedCache.markerRows;\n break wrapper;\n }\n }\n if (fileDiff == null || actions == null || markerRows == null) {\n return undefined;\n }\n return { fileDiff, actions, markerRows };\n }\n\n override hydrate(props: UnresolvedFileHydrationProps<LAnnotation>): void {\n const {\n file,\n fileDiff,\n actions,\n markerRows,\n lineAnnotations,\n fileContainer,\n prerenderedHTML,\n preventEmit = false,\n } = props;\n const source = this.getOrComputeDiff({\n file,\n fileDiff,\n actions,\n markerRows,\n });\n if (source == null) {\n return;\n }\n this.hydrateElements(fileContainer, prerenderedHTML);\n this.setActiveMergeConflictState(source.actions, source.markerRows);\n // If necessary hydration elements don't exist, we should assume a full\n // render\n if (\n shouldRenderCode(this.pre, source.fileDiff, this.options.collapsed) ||\n shouldRenderHeader(\n this.headerElement,\n source.fileDiff,\n this.options.disableFileHeader\n )\n ) {\n this.render({ ...props, preventEmit: true });\n }\n // Otherwise orchestrate our setup\n else {\n this.hydrationSetup({ fileDiff: source.fileDiff, lineAnnotations });\n if (this.pre != null) {\n this.renderMergeConflictActionSlots();\n }\n }\n if (!preventEmit) {\n this.emitPostRender();\n }\n }\n\n override rerender(): void {\n if (!this.enabled || this.fileDiff == null) {\n return;\n }\n this.render({ forceRender: true, renderRange: this.renderRange });\n }\n\n override render(props: UnresolvedFileRenderProps<LAnnotation> = {}): boolean {\n const {\n file,\n fileDiff,\n actions,\n markerRows,\n lineAnnotations,\n preventEmit = false,\n ...rest\n } = props;\n const source = this.getOrComputeDiff({\n file,\n fileDiff,\n actions,\n markerRows,\n });\n if (source == null) {\n return false;\n }\n this.setActiveMergeConflictState(source.actions, source.markerRows);\n const didRender = super.render({\n ...rest,\n fileDiff: source.fileDiff,\n lineAnnotations,\n preventEmit: true,\n });\n if (didRender) {\n this.renderMergeConflictActionSlots();\n if (!preventEmit) {\n this.emitPostRender();\n }\n }\n return didRender;\n }\n\n public resolveConflict(\n conflictIndex: number,\n resolution: MergeConflictResolution,\n fileDiff: FileDiffMetadata | undefined = this.computedCache.fileDiff\n ): ResolveConflictReturn | undefined {\n const action = this.conflictActions[conflictIndex];\n if (fileDiff == null || action == null) {\n return undefined;\n }\n\n if (action.conflictIndex !== conflictIndex) {\n console.error({ conflictIndex, action });\n throw new Error(\n \"UnresolvedFile.resolveConflict: conflictIndex and conflictAction don't match\"\n );\n }\n\n const newFileDiff = resolveConflictDiff(fileDiff, action, resolution);\n const previousFile = this.computedCache.file;\n const { file, actions, markerRows } = rebuildFileAndActions({\n fileDiff: newFileDiff,\n previousActions: this.conflictActions,\n resolvedConflictIndex: conflictIndex,\n previousFile,\n resolution,\n });\n\n return {\n file,\n fileDiff: newFileDiff,\n actions,\n markerRows,\n };\n }\n\n private resolveConflictAndRender(\n conflictIndex: number,\n resolution: MergeConflictResolution\n ): void {\n const action = this.conflictActions[conflictIndex];\n if (action == null) {\n return;\n }\n if (action.conflictIndex !== conflictIndex) {\n console.error({ conflictIndex, action });\n throw new Error(\n \"UnresolvedFile.resolveConflictAndRender: conflictIndex and conflictAction don't match\"\n );\n }\n const payload: MergeConflictActionPayload = {\n resolution,\n conflict: action.conflict,\n };\n const { file, fileDiff, actions, markerRows } =\n this.resolveConflict(conflictIndex, resolution) ?? {};\n if (\n file == null ||\n fileDiff == null ||\n actions == null ||\n markerRows == null\n ) {\n return;\n }\n\n this.computedCache = { file, fileDiff, actions, markerRows };\n this.setActiveMergeConflictState(actions, markerRows);\n // NOTE(amadeus): This is a bit jank, but helps to ensure we don't see a\n // bunch of jittery re-renders as things resolve out. In a more perfect\n // world we would have a more elegant way to kick off a render to the\n // highlighter and then resolve actions in a cleaner way, but time is short\n // right now. Can't let perfect be the enemy of good\n if (this.workerManager != null) {\n // Because we are using a workerManager, if we fire off the renderDiff\n // call, it will eventually get back to us in a callback which will\n // trigger a re-render\n this.hunksRenderer.renderDiff(fileDiff);\n } else {\n this.render({ forceRender: true });\n }\n this.options.onMergeConflictResolve?.(file, payload);\n }\n\n private setActiveMergeConflictState(\n actions: (MergeConflictDiffAction | undefined)[] = this.conflictActions,\n markerRows: MergeConflictMarkerRow[] = this.markerRows\n ): void {\n this.conflictActions = actions;\n this.markerRows = markerRows;\n if (\n this.computedCache.fileDiff != null &&\n this.hunksRenderer instanceof UnresolvedFileHunksRenderer\n ) {\n this.hunksRenderer.setConflictState(\n this.options.mergeConflictActionsType === 'none' ? [] : actions,\n markerRows,\n this.computedCache.fileDiff\n );\n }\n }\n\n private handleMergeConflictActionClick = (\n target: MergeConflictActionTarget\n ): void => {\n const action = this.conflictActions[target.conflictIndex];\n if (action == null) {\n return;\n }\n if (action.conflictIndex !== target.conflictIndex) {\n console.error({ conflictIndex: target.conflictIndex, action });\n throw new Error(\n \"UnresolvedFile.handleMergeConflictActionClick: conflictIndex and conflictAction don't match\"\n );\n }\n const payload: MergeConflictActionPayload = {\n resolution: target.resolution,\n conflict: action.conflict,\n };\n if (this.options.onMergeConflictAction != null) {\n this.options.onMergeConflictAction(payload, this);\n return;\n }\n this.resolveConflictAndRender(target.conflictIndex, target.resolution);\n };\n\n private renderMergeConflictActionSlots(): void {\n const { fileDiff } = this.computedCache;\n if (\n this.isContainerManaged ||\n this.fileContainer == null ||\n typeof this.options.mergeConflictActionsType !== 'function' ||\n this.conflictActions.length === 0 ||\n fileDiff == null\n ) {\n this.clearMergeConflictActionCache();\n return;\n }\n const staleActions = new Map(this.conflictActionCache);\n for (\n let actionIndex = 0;\n actionIndex < this.conflictActions.length;\n actionIndex++\n ) {\n const action = this.conflictActions[actionIndex];\n if (action == null) {\n continue;\n }\n if (action.conflictIndex !== actionIndex) {\n console.error({ conflictIndex: actionIndex, action });\n throw new Error(\n \"UnresolvedFile.renderMergeConflictActionSlots: conflictIndex and conflictAction don't match\"\n );\n }\n const anchor = getMergeConflictActionAnchor(action, fileDiff);\n if (anchor == null) {\n continue;\n }\n const conflictIndex = action.conflictIndex;\n const slotName = getMergeConflictActionSlotName({\n hunkIndex: anchor.hunkIndex,\n lineIndex: anchor.lineIndex,\n conflictIndex,\n });\n const id = `${actionIndex}-${slotName}`;\n let cache = this.conflictActionCache.get(id);\n if (\n cache == null ||\n !areMergeConflictActionsEqual(cache.action, action)\n ) {\n cache?.element.remove();\n const rendered = this.renderMergeConflictAction(action);\n if (rendered == null) {\n continue;\n }\n const element = createAnnotationWrapperNode(slotName);\n element.appendChild(rendered);\n this.fileContainer.appendChild(element);\n cache = { element, action };\n this.conflictActionCache.set(id, cache);\n }\n staleActions.delete(id);\n }\n for (const [id, { element }] of staleActions.entries()) {\n this.conflictActionCache.delete(id);\n element.remove();\n }\n }\n\n private renderMergeConflictAction(\n action: MergeConflictDiffAction\n ): HTMLElement | undefined {\n if (typeof this.options.mergeConflictActionsType !== 'function') {\n return undefined;\n }\n const rendered = this.options.mergeConflictActionsType(action, this);\n if (rendered == null) {\n return undefined;\n }\n if (rendered instanceof HTMLElement) {\n return rendered;\n }\n if (\n typeof DocumentFragment !== 'undefined' &&\n rendered instanceof DocumentFragment\n ) {\n const wrapper = document.createElement('div');\n wrapper.style.display = 'contents';\n wrapper.appendChild(rendered);\n return wrapper;\n }\n return undefined;\n }\n\n private clearMergeConflictActionCache(): void {\n for (const { element } of this.conflictActionCache.values()) {\n element.remove();\n }\n this.conflictActionCache.clear();\n }\n}\n\ninterface RebuildFileAndActionsProps {\n fileDiff: FileDiffMetadata;\n previousActions: (MergeConflictDiffAction | undefined)[];\n resolvedConflictIndex: number;\n // FIXME: Probably should remove this...\n // additionOffset: number;\n // deletionOffset: number;\n previousFile: FileContents | undefined;\n resolution: MergeConflictResolution;\n}\n\n// Rebuild the emitted unresolved file contents and remaining action anchors in\n// one pass over the post-resolution diff state.\nfunction rebuildFileAndActions({\n fileDiff,\n previousActions,\n resolvedConflictIndex,\n previousFile,\n resolution,\n}: RebuildFileAndActionsProps): Pick<\n ResolveConflictReturn,\n 'file' | 'actions' | 'markerRows'\n> {\n const resolvedAction = previousActions[resolvedConflictIndex];\n if (resolvedAction == null) {\n throw new Error(\n 'rebuildFileAndActions: missing resolved action for unresolved file rebuild'\n );\n }\n\n const actions = updateConflictActionsAfterResolution(\n previousActions,\n resolvedConflictIndex,\n resolvedAction,\n resolution\n );\n const markerRows = buildMergeConflictMarkerRows(fileDiff, actions);\n\n const file = rebuildUnresolvedFile({\n fileDiff,\n resolvedAction,\n resolvedConflictIndex,\n previousFile,\n resolution,\n });\n\n return {\n file,\n actions,\n markerRows,\n };\n}\n\ninterface RebuildUnresolvedFileProps {\n fileDiff: FileDiffMetadata;\n resolvedAction: MergeConflictDiffAction;\n resolvedConflictIndex: number;\n previousFile: FileContents | undefined;\n resolution: MergeConflictResolution;\n}\n\n// Rebuild the unresolved file text from the previous unresolved source so we\n// preserve remaining marker blocks exactly while the diff state stays in-place.\nfunction rebuildUnresolvedFile({\n resolvedAction,\n resolvedConflictIndex,\n previousFile,\n fileDiff,\n resolution,\n}: RebuildUnresolvedFileProps): FileContents {\n const previousContents = previousFile?.contents ?? '';\n const lines = splitFileContents(previousContents);\n const { conflict } = resolvedAction;\n const replacementLines = getResolvedConflictReplacementLines(\n lines,\n conflict,\n resolution\n );\n const contents = [\n ...lines.slice(0, conflict.startLineIndex),\n ...replacementLines,\n ...lines.slice(conflict.endLineIndex + 1),\n ].join('');\n\n return {\n name: previousFile?.name ?? fileDiff.name,\n contents,\n cacheKey:\n previousFile?.cacheKey != null\n ? `${previousFile.cacheKey}:mc-${resolvedConflictIndex}-${resolution}`\n : undefined,\n };\n}\n\nfunction getResolvedConflictReplacementLines(\n lines: string[],\n conflict: MergeConflictDiffAction['conflict'],\n resolution: MergeConflictResolution\n): string[] {\n const currentLines = lines.slice(\n conflict.startLineIndex + 1,\n conflict.baseMarkerLineIndex ?? conflict.separatorLineIndex\n );\n const incomingLines = lines.slice(\n conflict.separatorLineIndex + 1,\n conflict.endLineIndex\n );\n\n if (resolution === 'current') {\n return currentLines;\n }\n if (resolution === 'incoming') {\n return incomingLines;\n }\n return [...currentLines, ...incomingLines];\n}\n\n// The diff resolver keeps hunk/content group indexes stable, so the only\n// follow-up update we need here is shifting unresolved source-region line\n// numbers for later conflicts in the rebuilt file text.\nfunction updateConflictActionsAfterResolution(\n previousActions: (MergeConflictDiffAction | undefined)[],\n resolvedConflictIndex: number,\n resolvedAction: MergeConflictDiffAction,\n resolution: MergeConflictResolution\n): (MergeConflictDiffAction | undefined)[] {\n const lineDelta = getResolvedConflictLineDelta(\n resolvedAction.conflict,\n resolution\n );\n\n return previousActions.map((action, index) => {\n if (index === resolvedConflictIndex) {\n return undefined;\n }\n if (action == null) {\n return undefined;\n }\n if (action.conflict.startLineIndex > resolvedAction.conflict.endLineIndex) {\n return {\n ...action,\n conflict: shiftMergeConflictRegion(action.conflict, lineDelta),\n };\n }\n return action;\n });\n}\n\nfunction getResolvedConflictLineDelta(\n conflict: MergeConflictRegion,\n resolution: MergeConflictResolution\n): number {\n const currentLineCount =\n (conflict.baseMarkerLineIndex ?? conflict.separatorLineIndex) -\n conflict.startLineIndex -\n 1;\n const incomingLineCount =\n conflict.endLineIndex - conflict.separatorLineIndex - 1;\n const replacementLineCount =\n resolution === 'current'\n ? currentLineCount\n : resolution === 'incoming'\n ? incomingLineCount\n : currentLineCount + incomingLineCount;\n const conflictLineCount = conflict.endLineIndex - conflict.startLineIndex + 1;\n return replacementLineCount - conflictLineCount;\n}\n\nfunction shiftMergeConflictRegion(\n conflict: MergeConflictRegion,\n lineDelta: number\n): MergeConflictRegion {\n return {\n ...conflict,\n startLineIndex: conflict.startLineIndex + lineDelta,\n startLineNumber: conflict.startLineNumber + lineDelta,\n separatorLineIndex: conflict.separatorLineIndex + lineDelta,\n separatorLineNumber: conflict.separatorLineNumber + lineDelta,\n endLineIndex: conflict.endLineIndex + lineDelta,\n endLineNumber: conflict.endLineNumber + lineDelta,\n baseMarkerLineIndex:\n conflict.baseMarkerLineIndex != null\n ? conflict.baseMarkerLineIndex + lineDelta\n : undefined,\n baseMarkerLineNumber:\n conflict.baseMarkerLineNumber != null\n ? conflict.baseMarkerLineNumber + lineDelta\n : undefined,\n };\n}\n\nfunction shouldRenderCode(\n pre: HTMLPreElement | undefined,\n fileDiff: FileDiffMetadata | undefined,\n collapsed = false\n): boolean {\n return !collapsed && pre == null && fileDiff != null;\n}\n\nfunction shouldRenderHeader(\n headerElement: HTMLElement | undefined,\n fileDiff: FileDiffMetadata | undefined,\n disableFileHeader = false\n): boolean {\n return headerElement == null && fileDiff != null && !disableFileHeader;\n}\n\n// NOTE(amadeus): Should probably pull this out into a util, and make variants\n// for all component types\nexport function getUnresolvedDiffHunksRendererOptions<LAnnotation>(\n options?: UnresolvedFileOptions<LAnnotation>,\n baseOptions?: UnresolvedFileOptions<LAnnotation>\n): UnresolvedFileHunksRendererOptions {\n return {\n ...baseOptions,\n ...options,\n hunkSeparators:\n typeof options?.hunkSeparators === 'function'\n ? 'custom'\n : options?.hunkSeparators,\n mergeConflictActionsType:\n typeof options?.mergeConflictActionsType === 'function'\n ? 'custom'\n : options?.mergeConflictActionsType,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { FileContents, LineAnnotation, NumericScrollLineAnchor, PendingCodeViewLayoutReset, RenderWindow, StickySpecs, ThemeTypes, VirtualFileMetrics } from "../types.js";
|
|
2
2
|
import { WorkerPoolManager } from "../worker/WorkerPoolManager.js";
|
|
3
|
-
import "../worker/index.js";
|
|
4
3
|
import { File, FileOptions, FileRenderProps } from "./File.js";
|
|
5
4
|
import { Virtualizer } from "./Virtualizer.js";
|
|
6
5
|
import { CodeView } from "./CodeView.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualizedFile.d.ts","names":[
|
|
1
|
+
{"version":3,"file":"VirtualizedFile.d.ts","names":[],"sources":["../../src/components/VirtualizedFile.ts"],"mappings":";;;;;;;cAmEa,eAAA,kCAEH,IAAA,CAAK,WAAA;EAAA,QAkBH,WAAA;EAAA,QACA,OAAA;EAAA,SAlBQ,IAAA;EAEX,GAAA;EACA,MAAA;EAAA,QACC,KAAA;EAAA,QAKA,SAAA;EAAA,QACA,OAAA;EAAA,QACA,WAAA;EAAA,QACA,mBAAA;EAAA,QACA,gBAAA;EAER,WAAA,CACE,OAAA,EAAS,WAAA,CAAY,WAAA,eACb,WAAA,EAAa,WAAA,GAAc,QAAA,CAAS,WAAA,GACpC,OAAA,GAAS,kBAAA,EACjB,aAAA,GAAgB,iBAAA,EAChB,kBAAA;EAKK,UAAA,CAAW,OAAA,EAAS,kBAAA,EAAoB,KAAA;EAStC,kBAAA,CACP,eAAA,EAAiB,cAAA,CAAe,WAAA;EAAA,QAO1B,mBAAA;EAAA,QAcA,kBAAA;EASD,aAAA,CAAc,SAAA,UAAmB,eAAA;EAS/B,UAAA,CAAW,OAAA,EAAS,WAAA,CAAY,WAAA;EA2BhC,YAAA,CAAa,SAAA,EAAW,UAAA;EAAA,QAUzB,gBAAA;EAqBD,gBAAA;EA+FA,QAAA,GAAQ,KAAA;EAcR,mBAAA,CACL,IAAA,EAAM,YAAA,EACN,GAAA,UACA,KAAA,GAAQ,0BAAA,EACR,eAAA,GAAkB,cAAA,CAAe,WAAA;EA6B5B,eAAA,CACL,UAAA;IACG,GAAA;IAAa,MAAA;EAAA;EA8CX,sBAAA,CACL,gBAAA,WACC,uBAAA;EAoFI,oBAAA;EAIA,sBAAA,CACL,WAAA,GAAc,YAAA,GACb,WAAA;EAwCM,OAAA,CAAQ,OAAA;EAAA,QAaT,sBAAA;EAuED,aAAA,CAAc,OAAA;EAaZ,QAAA;EAQA,MAAA;IACP,aAAA;IACA,IAAA;IACA,WAAA;IACA,eAAA;IAAA,GACG;EAAA,GACF,eAAA,CAAgB,WAAA;EA+DZ,kBAAA;EAAA,UAIY,kCAAA;EAAA,QAIX,YAAA;EAAA,QAIA,cAAA;EAAA,QAIA,mBAAA;EAAA,QAWA,kCAAA;EAAA,QAiCA,4BAAA;EAAA,QAuCA,iBAAA;EAAA,QASA,oBAAA;EAAA,QAIA,wBAAA;EAAA,QAIA,4BAAA;AAAA"}
|
|
@@ -2,10 +2,9 @@ import { DEFAULT_VIRTUAL_FILE_METRICS } from "../constants.js";
|
|
|
2
2
|
import { areObjectsEqual } from "../utils/areObjectsEqual.js";
|
|
3
3
|
import { areOptionsEqual } from "../utils/areOptionsEqual.js";
|
|
4
4
|
import { getVirtualFileHeaderRegion, getVirtualFilePaddingBottom } from "../utils/computeVirtualFileMetrics.js";
|
|
5
|
-
import { FILE_ANNOTATION_DOM_KEY,
|
|
5
|
+
import { FILE_ANNOTATION_DOM_KEY, includesFileAnnotations, shouldRenderFileAnnotations } from "../utils/includesFileAnnotations.js";
|
|
6
6
|
import { iterateOverFile } from "../utils/iterateOverFile.js";
|
|
7
7
|
import { File } from "./File.js";
|
|
8
|
-
|
|
9
8
|
//#region src/components/VirtualizedFile.ts
|
|
10
9
|
const LAYOUT_CHECKPOINT_INTERVAL = 5e3;
|
|
11
10
|
let instanceId = -1;
|
|
@@ -13,6 +12,8 @@ function hasFileLayoutOptionChanged(previousOptions, nextOptions) {
|
|
|
13
12
|
return (previousOptions.overflow ?? "scroll") !== (nextOptions.overflow ?? "scroll") || (previousOptions.collapsed ?? false) !== (nextOptions.collapsed ?? false) || (previousOptions.disableLineNumbers ?? false) !== (nextOptions.disableLineNumbers ?? false) || (previousOptions.disableFileHeader ?? false) !== (nextOptions.disableFileHeader ?? false) || previousOptions.unsafeCSS !== nextOptions.unsafeCSS;
|
|
14
13
|
}
|
|
15
14
|
var VirtualizedFile = class extends File {
|
|
15
|
+
virtualizer;
|
|
16
|
+
metrics;
|
|
16
17
|
__id = `virtualized-file:${++instanceId}`;
|
|
17
18
|
top;
|
|
18
19
|
height = 0;
|
|
@@ -46,7 +47,7 @@ var VirtualizedFile = class extends File {
|
|
|
46
47
|
return true;
|
|
47
48
|
}
|
|
48
49
|
hasLineAnnotations() {
|
|
49
|
-
return this.lineAnnotations.some((annotation) => annotation.lineNumber >
|
|
50
|
+
return this.lineAnnotations.some((annotation) => annotation.lineNumber > 0);
|
|
50
51
|
}
|
|
51
52
|
getLineHeight(lineIndex, hasMetadataLine = false) {
|
|
52
53
|
const cached = this.cache.heights.get(lineIndex);
|
|
@@ -284,7 +285,7 @@ var VirtualizedFile = class extends File {
|
|
|
284
285
|
this.forceRenderOverride = true;
|
|
285
286
|
this.virtualizer.instanceChanged(this, false);
|
|
286
287
|
}
|
|
287
|
-
render({ fileContainer, file, forceRender = false, lineAnnotations
|
|
288
|
+
render({ fileContainer, file, forceRender = false, lineAnnotations, ...props }) {
|
|
288
289
|
const { forceRenderOverride, isSetup } = this;
|
|
289
290
|
this.forceRenderOverride = void 0;
|
|
290
291
|
const annotationsChanged = this.syncLineAnnotations(lineAnnotations);
|
|
@@ -425,17 +426,17 @@ var VirtualizedFile = class extends File {
|
|
|
425
426
|
bufferAfter: fileHeight - headerRegion - paddingBottom
|
|
426
427
|
};
|
|
427
428
|
const centerLine = Math.floor(measuredFileAnnotationVisible && viewportCenter < fileTop + codeRegionTop ? 0 : (viewportCenter - (fileTop + codeRegionTop)) / lineHeight);
|
|
428
|
-
const idealStartHunk
|
|
429
|
+
const idealStartHunk = Math.floor(centerLine / hunkLineCount) - Math.floor(totalHunks / 2);
|
|
429
430
|
const totalHunksInFile = Math.ceil(lineCount / hunkLineCount);
|
|
430
|
-
const startingLine
|
|
431
|
-
const clampedTotalLines
|
|
432
|
-
const bufferBefore
|
|
433
|
-
const renderedLines = Math.min(clampedTotalLines
|
|
431
|
+
const startingLine = Math.max(0, Math.min(idealStartHunk, totalHunksInFile)) * hunkLineCount;
|
|
432
|
+
const clampedTotalLines = idealStartHunk < 0 ? totalLines + idealStartHunk * hunkLineCount : totalLines;
|
|
433
|
+
const bufferBefore = startingLine === 0 ? 0 : fileAnnotationHeight + startingLine * lineHeight;
|
|
434
|
+
const renderedLines = Math.min(clampedTotalLines, lineCount - startingLine);
|
|
434
435
|
return {
|
|
435
|
-
startingLine
|
|
436
|
-
totalLines: clampedTotalLines
|
|
437
|
-
bufferBefore
|
|
438
|
-
bufferAfter: Math.max(0, (lineCount - startingLine
|
|
436
|
+
startingLine,
|
|
437
|
+
totalLines: clampedTotalLines,
|
|
438
|
+
bufferBefore,
|
|
439
|
+
bufferAfter: Math.max(0, (lineCount - startingLine - renderedLines) * lineHeight)
|
|
439
440
|
};
|
|
440
441
|
}
|
|
441
442
|
const overflowHunks = totalHunks;
|
|
@@ -459,12 +460,12 @@ var VirtualizedFile = class extends File {
|
|
|
459
460
|
overflowCounter--;
|
|
460
461
|
}
|
|
461
462
|
}
|
|
462
|
-
const lineHeight
|
|
463
|
-
if (absoluteLineTop > top - lineHeight
|
|
464
|
-
if (absoluteLineTop + lineHeight
|
|
463
|
+
const lineHeight = this.getLineHeight(lineIndex, false);
|
|
464
|
+
if (absoluteLineTop > top - lineHeight && absoluteLineTop < bottom) firstVisibleHunk ??= currentHunk;
|
|
465
|
+
if (absoluteLineTop + lineHeight > viewportCenter) centerHunk ??= currentHunk;
|
|
465
466
|
if (overflowCounter == null && absoluteLineTop >= bottom && isAtHunkBoundary) overflowCounter = overflowHunks;
|
|
466
467
|
currentLine++;
|
|
467
|
-
absoluteLineTop += lineHeight
|
|
468
|
+
absoluteLineTop += lineHeight;
|
|
468
469
|
return false;
|
|
469
470
|
}
|
|
470
471
|
});
|
|
@@ -509,7 +510,7 @@ function getLastVisibleLineIndex(lines) {
|
|
|
509
510
|
if (lastLine == null || lastLine === "" || lastLine === "\n" || lastLine === "\r\n" || lastLine === "\r") return lines.length - 2;
|
|
510
511
|
return lines.length - 1;
|
|
511
512
|
}
|
|
512
|
-
|
|
513
513
|
//#endregion
|
|
514
514
|
export { VirtualizedFile };
|
|
515
|
+
|
|
515
516
|
//# sourceMappingURL=VirtualizedFile.js.map
|