@pierre/diffs 1.3.0-beta.4 → 1.3.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -15
- package/dist/components/CodeView.d.ts +10 -11
- package/dist/components/CodeView.d.ts.map +1 -1
- package/dist/components/CodeView.js +14 -14
- package/dist/components/CodeView.js.map +1 -1
- package/dist/components/File.d.ts +4 -4
- package/dist/components/File.d.ts.map +1 -1
- package/dist/components/File.js +53 -24
- package/dist/components/File.js.map +1 -1
- package/dist/components/FileDiff.d.ts +19 -18
- package/dist/components/FileDiff.d.ts.map +1 -1
- package/dist/components/FileDiff.js +89 -58
- package/dist/components/FileDiff.js.map +1 -1
- package/dist/components/FileStream.d.ts +0 -1
- package/dist/components/FileStream.d.ts.map +1 -1
- package/dist/components/FileStream.js +8 -6
- package/dist/components/FileStream.js.map +1 -1
- package/dist/components/UnresolvedFile.d.ts +1 -2
- package/dist/components/UnresolvedFile.d.ts.map +1 -1
- package/dist/components/UnresolvedFile.js +3 -3
- package/dist/components/UnresolvedFile.js.map +1 -1
- package/dist/components/VirtualizedFile.d.ts +5 -2
- package/dist/components/VirtualizedFile.d.ts.map +1 -1
- package/dist/components/VirtualizedFile.js +97 -35
- package/dist/components/VirtualizedFile.js.map +1 -1
- package/dist/components/VirtualizedFileDiff.d.ts +8 -4
- package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
- package/dist/components/VirtualizedFileDiff.js +91 -30
- package/dist/components/VirtualizedFileDiff.js.map +1 -1
- package/dist/components/Virtualizer.d.ts +1 -1
- package/dist/components/Virtualizer.d.ts.map +1 -1
- package/dist/components/Virtualizer.js +23 -24
- package/dist/components/Virtualizer.js.map +1 -1
- package/dist/components/VirtulizerDevelopment.d.ts.map +1 -1
- package/dist/components/web-components.d.ts.map +1 -1
- package/dist/components/web-components.js +2 -3
- package/dist/components/web-components.js.map +1 -1
- package/dist/constants.d.ts +3 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +3 -2
- package/dist/constants.js.map +1 -1
- package/dist/editor/command.d.ts +3 -2
- package/dist/editor/command.d.ts.map +1 -1
- package/dist/editor/command.js +10 -6
- package/dist/editor/command.js.map +1 -1
- package/dist/editor/editStack.d.ts +7 -1
- package/dist/editor/editStack.d.ts.map +1 -1
- package/dist/editor/editStack.js +3 -3
- package/dist/editor/editStack.js.map +1 -1
- package/dist/editor/editor.d.ts +56 -6
- package/dist/editor/editor.d.ts.map +1 -1
- package/dist/editor/editor.js +758 -397
- package/dist/editor/editor.js.map +1 -1
- package/dist/editor/editor2.js +3 -3
- package/dist/editor/editor2.js.map +1 -1
- package/dist/editor/index.d.ts +2 -2
- package/dist/editor/index.js +1 -2
- package/dist/editor/lineAnnotations.d.ts.map +1 -1
- package/dist/editor/lineAnnotations.js +2 -3
- package/dist/editor/lineAnnotations.js.map +1 -1
- package/dist/editor/marker.d.ts +4 -3
- package/dist/editor/marker.d.ts.map +1 -1
- package/dist/editor/marker.js +30 -13
- package/dist/editor/marker.js.map +1 -1
- package/dist/editor/pieceTable.d.ts +10 -3
- package/dist/editor/pieceTable.d.ts.map +1 -1
- package/dist/editor/pieceTable.js +170 -129
- package/dist/editor/pieceTable.js.map +1 -1
- package/dist/editor/platform.d.ts +8 -1
- package/dist/editor/platform.d.ts.map +1 -1
- package/dist/editor/platform.js +16 -5
- package/dist/editor/platform.js.map +1 -1
- package/dist/editor/searchPanel.d.ts +13 -3
- package/dist/editor/searchPanel.d.ts.map +1 -1
- package/dist/editor/searchPanel.js +194 -67
- package/dist/editor/searchPanel.js.map +1 -1
- package/dist/editor/selection.d.ts +41 -4
- package/dist/editor/selection.d.ts.map +1 -1
- package/dist/editor/selection.js +423 -83
- package/dist/editor/selection.js.map +1 -1
- package/dist/editor/selectionAction.d.ts +4 -5
- package/dist/editor/selectionAction.d.ts.map +1 -1
- package/dist/editor/selectionAction.js +14 -64
- package/dist/editor/selectionAction.js.map +1 -1
- package/dist/editor/sprite.d.ts +2 -2
- package/dist/editor/sprite.d.ts.map +1 -1
- package/dist/editor/sprite.js +8 -8
- package/dist/editor/sprite.js.map +1 -1
- package/dist/editor/textDocument.d.ts +5 -4
- package/dist/editor/textDocument.d.ts.map +1 -1
- package/dist/editor/textDocument.js +26 -15
- package/dist/editor/textDocument.js.map +1 -1
- package/dist/editor/textMeasure.d.ts +37 -3
- package/dist/editor/textMeasure.d.ts.map +1 -1
- package/dist/editor/textMeasure.js +85 -10
- package/dist/editor/textMeasure.js.map +1 -1
- package/dist/editor/tokenzier.d.ts +1 -0
- package/dist/editor/tokenzier.d.ts.map +1 -1
- package/dist/editor/tokenzier.js +25 -19
- package/dist/editor/tokenzier.js.map +1 -1
- package/dist/editor/utils.d.ts +2 -1
- package/dist/editor/utils.d.ts.map +1 -1
- package/dist/editor/utils.js +6 -3
- package/dist/editor/utils.js.map +1 -1
- package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
- package/dist/highlighter/languages/areLanguagesAttached.js +1 -2
- package/dist/highlighter/languages/areLanguagesAttached.js.map +1 -1
- package/dist/highlighter/languages/attachResolvedLanguages.d.ts +0 -2
- package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/attachResolvedLanguages.js +1 -2
- package/dist/highlighter/languages/attachResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/cleanUpResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/cleanUpResolvedLanguages.js +1 -2
- package/dist/highlighter/languages/cleanUpResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/constants.d.ts +0 -1
- package/dist/highlighter/languages/constants.d.ts.map +1 -1
- package/dist/highlighter/languages/constants.js +1 -1
- package/dist/highlighter/languages/constants.js.map +1 -1
- package/dist/highlighter/languages/getResolvedLanguages.d.ts +0 -2
- package/dist/highlighter/languages/getResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/getResolvedLanguages.js +1 -2
- package/dist/highlighter/languages/getResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +0 -2
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.js +1 -2
- package/dist/highlighter/languages/getResolvedOrResolveLanguage.js.map +1 -1
- package/dist/highlighter/languages/hasResolvedLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/hasResolvedLanguages.js +1 -2
- package/dist/highlighter/languages/hasResolvedLanguages.js.map +1 -1
- package/dist/highlighter/languages/registerCustomLanguage.d.ts +0 -1
- package/dist/highlighter/languages/registerCustomLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/registerCustomLanguage.js +1 -2
- package/dist/highlighter/languages/registerCustomLanguage.js.map +1 -1
- package/dist/highlighter/languages/resolveLanguage.d.ts +0 -2
- package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
- package/dist/highlighter/languages/resolveLanguage.js +4 -5
- package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
- package/dist/highlighter/languages/resolveLanguages.d.ts +0 -2
- package/dist/highlighter/languages/resolveLanguages.d.ts.map +1 -1
- package/dist/highlighter/languages/resolveLanguages.js +1 -2
- package/dist/highlighter/languages/resolveLanguages.js.map +1 -1
- package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
- package/dist/highlighter/shared_highlighter.js +3 -4
- package/dist/highlighter/shared_highlighter.js.map +1 -1
- package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
- package/dist/highlighter/themes/areThemesAttached.js +1 -2
- package/dist/highlighter/themes/areThemesAttached.js.map +1 -1
- package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/attachResolvedThemes.js +1 -2
- package/dist/highlighter/themes/attachResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/cleanUpResolvedThemes.js +1 -2
- package/dist/highlighter/themes/cleanUpResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/constants.d.ts.map +1 -1
- package/dist/highlighter/themes/constants.js +1 -1
- package/dist/highlighter/themes/constants.js.map +1 -1
- package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/getResolvedOrResolveTheme.js +1 -2
- package/dist/highlighter/themes/getResolvedOrResolveTheme.js.map +1 -1
- package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/getResolvedThemes.js +1 -2
- package/dist/highlighter/themes/getResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/hasResolvedThemes.js +1 -2
- package/dist/highlighter/themes/hasResolvedThemes.js.map +1 -1
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.js +1 -2
- package/dist/highlighter/themes/registerCustomCSSVariableTheme.js.map +1 -1
- package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/registerCustomTheme.js +1 -2
- package/dist/highlighter/themes/registerCustomTheme.js.map +1 -1
- package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
- package/dist/highlighter/themes/resolveTheme.js +1 -2
- package/dist/highlighter/themes/resolveTheme.js.map +1 -1
- package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
- package/dist/highlighter/themes/resolveThemes.js +1 -2
- package/dist/highlighter/themes/resolveThemes.js.map +1 -1
- package/dist/highlighter/themes/themeResolution.d.ts.map +1 -1
- package/dist/highlighter/themes/themeResolution.js +1 -2
- package/dist/highlighter/themes/themeResolution.js.map +1 -1
- package/dist/highlighter/themes/themeResolver.d.ts +2 -2
- package/dist/highlighter/themes/themeResolver.d.ts.map +1 -1
- package/dist/highlighter/themes/themeResolver.js +1 -2
- package/dist/highlighter/themes/themeResolver.js.map +1 -1
- package/dist/index.d.ts +10 -10
- package/dist/index.js +2 -3
- package/dist/managers/InteractionManager.d.ts +7 -0
- package/dist/managers/InteractionManager.d.ts.map +1 -1
- package/dist/managers/InteractionManager.js +26 -4
- package/dist/managers/InteractionManager.js.map +1 -1
- package/dist/managers/ResizeManager.d.ts.map +1 -1
- package/dist/managers/ResizeManager.js +2 -2
- package/dist/managers/ResizeManager.js.map +1 -1
- package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
- package/dist/managers/ScrollSyncManager.js +1 -1
- package/dist/managers/ScrollSyncManager.js.map +1 -1
- package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
- package/dist/managers/UniversalRenderingManager.js +2 -2
- package/dist/managers/UniversalRenderingManager.js.map +1 -1
- package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts +228 -0
- package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts.map +1 -0
- package/dist/node_modules/.pnpm/@types_unist@3.0.3/node_modules/@types/unist/index.d.ts +84 -0
- package/dist/node_modules/.pnpm/@types_unist@3.0.3/node_modules/@types/unist/index.d.ts.map +1 -0
- package/dist/react/CodeView.d.ts +1 -1
- package/dist/react/CodeView.d.ts.map +1 -1
- package/dist/react/CodeView.js +16 -15
- package/dist/react/CodeView.js.map +1 -1
- package/dist/react/EditorContext.d.ts +0 -1
- package/dist/react/EditorContext.d.ts.map +1 -1
- package/dist/react/EditorContext.js +2 -5
- package/dist/react/EditorContext.js.map +1 -1
- package/dist/react/File.d.ts +1 -0
- package/dist/react/File.d.ts.map +1 -1
- package/dist/react/File.js +4 -6
- package/dist/react/File.js.map +1 -1
- package/dist/react/FileDiff.d.ts +1 -0
- package/dist/react/FileDiff.d.ts.map +1 -1
- package/dist/react/FileDiff.js +4 -6
- package/dist/react/FileDiff.js.map +1 -1
- package/dist/react/MultiFileDiff.d.ts +1 -0
- package/dist/react/MultiFileDiff.d.ts.map +1 -1
- package/dist/react/MultiFileDiff.js +4 -6
- package/dist/react/MultiFileDiff.js.map +1 -1
- package/dist/react/PatchDiff.d.ts +1 -0
- package/dist/react/PatchDiff.d.ts.map +1 -1
- package/dist/react/PatchDiff.js +4 -6
- package/dist/react/PatchDiff.js.map +1 -1
- package/dist/react/UnresolvedFile.d.ts +2 -1
- package/dist/react/UnresolvedFile.d.ts.map +1 -1
- package/dist/react/UnresolvedFile.js +4 -6
- package/dist/react/UnresolvedFile.js.map +1 -1
- package/dist/react/Virtualizer.d.ts.map +1 -1
- package/dist/react/Virtualizer.js +2 -5
- package/dist/react/Virtualizer.js.map +1 -1
- package/dist/react/WorkerPoolContext.d.ts +0 -1
- package/dist/react/WorkerPoolContext.d.ts.map +1 -1
- package/dist/react/WorkerPoolContext.js +2 -5
- package/dist/react/WorkerPoolContext.js.map +1 -1
- package/dist/react/constants.d.ts.map +1 -1
- package/dist/react/constants.js +1 -1
- package/dist/react/constants.js.map +1 -1
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.js +1 -2
- package/dist/react/jsx.d.ts +0 -2
- package/dist/react/jsx.d.ts.map +1 -1
- package/dist/react/types.d.ts +2 -0
- package/dist/react/types.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.d.ts +2 -0
- package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.js +18 -11
- package/dist/react/utils/renderDiffChildren.js.map +1 -1
- package/dist/react/utils/renderFileChildren.d.ts +2 -0
- package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
- package/dist/react/utils/renderFileChildren.js +18 -11
- package/dist/react/utils/renderFileChildren.js.map +1 -1
- package/dist/react/utils/templateRender.d.ts.map +1 -1
- package/dist/react/utils/templateRender.js +1 -2
- package/dist/react/utils/templateRender.js.map +1 -1
- package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
- package/dist/react/utils/useFileDiffInstance.js +1 -3
- package/dist/react/utils/useFileDiffInstance.js.map +1 -1
- package/dist/react/utils/useFileInstance.d.ts.map +1 -1
- package/dist/react/utils/useFileInstance.js +1 -2
- package/dist/react/utils/useFileInstance.js.map +1 -1
- package/dist/react/utils/useStableCallback.d.ts.map +1 -1
- package/dist/react/utils/useStableCallback.js +1 -2
- package/dist/react/utils/useStableCallback.js.map +1 -1
- package/dist/react/utils/useUnresolvedFileInstance.d.ts.map +1 -1
- package/dist/react/utils/useUnresolvedFileInstance.js +10 -11
- package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -1
- package/dist/renderers/DiffHunksRenderer.d.ts +5 -5
- package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/DiffHunksRenderer.js +73 -20
- package/dist/renderers/DiffHunksRenderer.js.map +1 -1
- package/dist/renderers/FileRenderer.d.ts +1 -3
- package/dist/renderers/FileRenderer.d.ts.map +1 -1
- package/dist/renderers/FileRenderer.js +23 -8
- package/dist/renderers/FileRenderer.js.map +1 -1
- package/dist/renderers/UnresolvedFileHunksRenderer.d.ts +1 -2
- package/dist/renderers/UnresolvedFileHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/UnresolvedFileHunksRenderer.js +1 -2
- package/dist/renderers/UnresolvedFileHunksRenderer.js.map +1 -1
- package/dist/shiki-stream/index.js +1 -2
- package/dist/shiki-stream/stream.d.ts +0 -1
- package/dist/shiki-stream/stream.d.ts.map +1 -1
- package/dist/shiki-stream/stream.js +1 -2
- package/dist/shiki-stream/stream.js.map +1 -1
- package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
- package/dist/shiki-stream/tokenizer.js +1 -1
- package/dist/shiki-stream/tokenizer.js.map +1 -1
- package/dist/shiki-stream/types.d.ts +0 -1
- package/dist/shiki-stream/types.d.ts.map +1 -1
- package/dist/sprite.d.ts.map +1 -1
- package/dist/sprite.js +1 -1
- package/dist/ssr/FileDiffReact.d.ts.map +1 -1
- package/dist/ssr/FileDiffReact.js +4 -7
- package/dist/ssr/FileDiffReact.js.map +1 -1
- package/dist/ssr/index.d.ts +2 -2
- package/dist/ssr/index.js +1 -2
- package/dist/ssr/preloadDiffs.d.ts +1 -1
- package/dist/ssr/preloadDiffs.d.ts.map +1 -1
- package/dist/ssr/preloadDiffs.js +1 -2
- package/dist/ssr/preloadDiffs.js.map +1 -1
- package/dist/ssr/preloadFile.d.ts.map +1 -1
- package/dist/ssr/preloadFile.js +1 -2
- package/dist/ssr/preloadFile.js.map +1 -1
- package/dist/ssr/preloadPatchFile.d.ts.map +1 -1
- package/dist/ssr/preloadPatchFile.js +2 -3
- package/dist/ssr/preloadPatchFile.js.map +1 -1
- package/dist/ssr/renderHTML.d.ts +1 -1
- package/dist/ssr/renderHTML.d.ts.map +1 -1
- package/dist/ssr/renderHTML.js +1 -2
- package/dist/ssr/renderHTML.js.map +1 -1
- package/dist/string-import.d.ts +4 -0
- package/dist/string-import.d.ts.map +1 -1
- package/dist/style.js +3 -3
- package/dist/style.js.map +1 -1
- package/dist/types.d.ts +27 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -1
- package/dist/utils/areDiffLineAnnotationsEqual.js +1 -1
- package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -1
- package/dist/utils/areDiffRenderOptionsEqual.d.ts.map +1 -1
- package/dist/utils/areDiffRenderOptionsEqual.js +1 -2
- package/dist/utils/areDiffRenderOptionsEqual.js.map +1 -1
- package/dist/utils/areDiffTargetsEqual.d.ts.map +1 -1
- package/dist/utils/areDiffTargetsEqual.js +1 -1
- package/dist/utils/areDiffTargetsEqual.js.map +1 -1
- package/dist/utils/areFileRenderOptionsEqual.d.ts.map +1 -1
- package/dist/utils/areFileRenderOptionsEqual.js +1 -2
- package/dist/utils/areFileRenderOptionsEqual.js.map +1 -1
- package/dist/utils/areFilesEqual.d.ts.map +1 -1
- package/dist/utils/areFilesEqual.js +1 -1
- package/dist/utils/areFilesEqual.js.map +1 -1
- package/dist/utils/areHunkDataEqual.d.ts.map +1 -1
- package/dist/utils/areHunkDataEqual.js +1 -1
- package/dist/utils/areHunkDataEqual.js.map +1 -1
- package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -1
- package/dist/utils/areLineAnnotationsEqual.js +1 -1
- package/dist/utils/areLineAnnotationsEqual.js.map +1 -1
- package/dist/utils/areManagedSnapshotsEqual.d.ts.map +1 -1
- package/dist/utils/areManagedSnapshotsEqual.js +1 -1
- package/dist/utils/areManagedSnapshotsEqual.js.map +1 -1
- package/dist/utils/areMergeConflictActionsEqual.d.ts.map +1 -1
- package/dist/utils/areMergeConflictActionsEqual.js +1 -1
- package/dist/utils/areMergeConflictActionsEqual.js.map +1 -1
- package/dist/utils/areObjectsEqual.d.ts.map +1 -1
- package/dist/utils/areObjectsEqual.js +1 -1
- package/dist/utils/areObjectsEqual.js.map +1 -1
- package/dist/utils/areOptionsEqual.d.ts +0 -2
- package/dist/utils/areOptionsEqual.d.ts.map +1 -1
- package/dist/utils/areOptionsEqual.js +1 -2
- package/dist/utils/areOptionsEqual.js.map +1 -1
- package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -1
- package/dist/utils/arePrePropertiesEqual.js +1 -1
- package/dist/utils/arePrePropertiesEqual.js.map +1 -1
- package/dist/utils/areRenderRangesEqual.d.ts.map +1 -1
- package/dist/utils/areRenderRangesEqual.js +1 -1
- package/dist/utils/areRenderRangesEqual.js.map +1 -1
- package/dist/utils/areSelectionPointsEqual.d.ts.map +1 -1
- package/dist/utils/areSelectionPointsEqual.js +1 -1
- package/dist/utils/areSelectionPointsEqual.js.map +1 -1
- package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
- package/dist/utils/areSelectionsEqual.js +1 -1
- package/dist/utils/areSelectionsEqual.js.map +1 -1
- package/dist/utils/areThemesEqual.d.ts.map +1 -1
- package/dist/utils/areThemesEqual.js +1 -1
- package/dist/utils/areThemesEqual.js.map +1 -1
- package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -1
- package/dist/utils/areVirtualWindowSpecsEqual.js +1 -1
- package/dist/utils/areVirtualWindowSpecsEqual.js.map +1 -1
- package/dist/utils/areWorkerStatsEqual.d.ts +0 -2
- package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -1
- package/dist/utils/areWorkerStatsEqual.js +1 -1
- package/dist/utils/areWorkerStatsEqual.js.map +1 -1
- package/dist/utils/cleanLastNewline.d.ts.map +1 -1
- package/dist/utils/cleanLastNewline.js +1 -1
- package/dist/utils/cleanLastNewline.js.map +1 -1
- package/dist/utils/computeEstimatedDiffHeights.d.ts.map +1 -1
- package/dist/utils/computeEstimatedDiffHeights.js +1 -2
- package/dist/utils/computeEstimatedDiffHeights.js.map +1 -1
- package/dist/utils/computeFileOffsets.d.ts +9 -1
- package/dist/utils/computeFileOffsets.d.ts.map +1 -1
- package/dist/utils/computeFileOffsets.js +20 -2
- package/dist/utils/computeFileOffsets.js.map +1 -1
- package/dist/utils/computeVirtualFileMetrics.d.ts.map +1 -1
- package/dist/utils/computeVirtualFileMetrics.js +1 -2
- package/dist/utils/computeVirtualFileMetrics.js.map +1 -1
- package/dist/utils/createAnnotationElement.d.ts +1 -1
- package/dist/utils/createAnnotationElement.d.ts.map +1 -1
- package/dist/utils/createAnnotationElement.js +1 -2
- package/dist/utils/createAnnotationElement.js.map +1 -1
- package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -1
- package/dist/utils/createAnnotationWrapperNode.js +1 -1
- package/dist/utils/createAnnotationWrapperNode.js.map +1 -1
- package/dist/utils/createContentColumn.d.ts +1 -1
- package/dist/utils/createContentColumn.d.ts.map +1 -1
- package/dist/utils/createContentColumn.js +1 -2
- package/dist/utils/createContentColumn.js.map +1 -1
- package/dist/utils/createEmptyRowBuffer.d.ts +1 -1
- package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -1
- package/dist/utils/createEmptyRowBuffer.js +1 -2
- package/dist/utils/createEmptyRowBuffer.js.map +1 -1
- package/dist/utils/createFileHeaderElement.d.ts +1 -1
- package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
- package/dist/utils/createFileHeaderElement.js +6 -3
- package/dist/utils/createFileHeaderElement.js.map +1 -1
- package/dist/utils/createGutterUtilityContentNode.d.ts.map +1 -1
- package/dist/utils/createGutterUtilityContentNode.js +1 -1
- package/dist/utils/createGutterUtilityContentNode.js.map +1 -1
- package/dist/utils/createGutterUtilityElement.d.ts +1 -1
- package/dist/utils/createGutterUtilityElement.d.ts.map +1 -1
- package/dist/utils/createGutterUtilityElement.js +1 -2
- package/dist/utils/createGutterUtilityElement.js.map +1 -1
- package/dist/utils/createNoNewlineElement.d.ts +1 -1
- package/dist/utils/createNoNewlineElement.d.ts.map +1 -1
- package/dist/utils/createNoNewlineElement.js +1 -2
- package/dist/utils/createNoNewlineElement.js.map +1 -1
- package/dist/utils/createPreElement.d.ts +1 -1
- package/dist/utils/createPreElement.d.ts.map +1 -1
- package/dist/utils/createPreElement.js +1 -2
- package/dist/utils/createPreElement.js.map +1 -1
- package/dist/utils/createRowNodes.d.ts.map +1 -1
- package/dist/utils/createRowNodes.js +1 -1
- package/dist/utils/createRowNodes.js.map +1 -1
- package/dist/utils/createSeparator.d.ts +1 -1
- package/dist/utils/createSeparator.d.ts.map +1 -1
- package/dist/utils/createSeparator.js +1 -2
- package/dist/utils/createSeparator.js.map +1 -1
- package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
- package/dist/utils/createSpanNodeFromToken.js +1 -2
- package/dist/utils/createSpanNodeFromToken.js.map +1 -1
- package/dist/utils/createStyleElement.d.ts +1 -1
- package/dist/utils/createStyleElement.d.ts.map +1 -1
- package/dist/utils/createStyleElement.js +1 -2
- package/dist/utils/createStyleElement.js.map +1 -1
- package/dist/utils/createTransformerWithState.d.ts.map +1 -1
- package/dist/utils/createTransformerWithState.js +1 -2
- package/dist/utils/createTransformerWithState.js.map +1 -1
- package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -1
- package/dist/utils/createUnsafeCSSStyleNode.js +1 -2
- package/dist/utils/createUnsafeCSSStyleNode.js.map +1 -1
- package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
- package/dist/utils/createWindowFromScrollPosition.js +5 -5
- package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
- package/dist/utils/cssWrappers.d.ts.map +1 -1
- package/dist/utils/cssWrappers.js +2 -3
- package/dist/utils/cssWrappers.js.map +1 -1
- package/dist/utils/detachString.d.ts.map +1 -1
- package/dist/utils/detachString.js +1 -1
- package/dist/utils/detachString.js.map +1 -1
- package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
- package/dist/utils/diffAcceptRejectHunk.js +1 -2
- package/dist/utils/diffAcceptRejectHunk.js.map +1 -1
- package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -1
- package/dist/utils/formatCSSVariablePrefix.js +1 -1
- package/dist/utils/formatCSSVariablePrefix.js.map +1 -1
- package/dist/utils/getDiffHunksRendererOptions.d.ts.map +1 -1
- package/dist/utils/getDiffHunksRendererOptions.js +1 -1
- package/dist/utils/getDiffHunksRendererOptions.js.map +1 -1
- package/dist/utils/getFileRendererOptions.d.ts.map +1 -1
- package/dist/utils/getFileRendererOptions.js +1 -1
- package/dist/utils/getFileRendererOptions.js.map +1 -1
- package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
- package/dist/utils/getFiletypeFromFileName.js +1 -1
- package/dist/utils/getFiletypeFromFileName.js.map +1 -1
- package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
- package/dist/utils/getHighlighterOptions.js +1 -2
- package/dist/utils/getHighlighterOptions.js.map +1 -1
- package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
- package/dist/utils/getHighlighterThemeStyles.js +1 -2
- package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
- package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -1
- package/dist/utils/getHunkSeparatorSlotName.js +1 -1
- package/dist/utils/getHunkSeparatorSlotName.js.map +1 -1
- package/dist/utils/getIconForType.d.ts.map +1 -1
- package/dist/utils/getIconForType.js +1 -1
- package/dist/utils/getIconForType.js.map +1 -1
- package/dist/utils/getLineAnnotationName.d.ts.map +1 -1
- package/dist/utils/getLineAnnotationName.js +1 -1
- package/dist/utils/getLineAnnotationName.js.map +1 -1
- package/dist/utils/getLineEndingType.d.ts.map +1 -1
- package/dist/utils/getLineEndingType.js +1 -1
- package/dist/utils/getLineEndingType.js.map +1 -1
- package/dist/utils/getLineNodes.d.ts +1 -1
- package/dist/utils/getLineNodes.d.ts.map +1 -1
- package/dist/utils/getLineNodes.js +1 -1
- package/dist/utils/getLineNodes.js.map +1 -1
- package/dist/utils/getMergeConflictActionSlotName.d.ts.map +1 -1
- package/dist/utils/getMergeConflictActionSlotName.js +1 -1
- package/dist/utils/getMergeConflictActionSlotName.js.map +1 -1
- package/dist/utils/getMergeConflictLineTypes.d.ts.map +1 -1
- package/dist/utils/getMergeConflictLineTypes.js +1 -2
- package/dist/utils/getMergeConflictLineTypes.js.map +1 -1
- package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
- package/dist/utils/getOrCreateCodeNode.js +1 -1
- package/dist/utils/getOrCreateCodeNode.js.map +1 -1
- package/dist/utils/getSingularPatch.d.ts.map +1 -1
- package/dist/utils/getSingularPatch.js +1 -2
- package/dist/utils/getSingularPatch.js.map +1 -1
- package/dist/utils/getThemes.d.ts.map +1 -1
- package/dist/utils/getThemes.js +1 -2
- package/dist/utils/getThemes.js.map +1 -1
- package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
- package/dist/utils/getTotalLineCountFromHunks.js +1 -1
- package/dist/utils/getTotalLineCountFromHunks.js.map +1 -1
- package/dist/utils/hast_utils.d.ts +1 -1
- package/dist/utils/hast_utils.d.ts.map +1 -1
- package/dist/utils/hast_utils.js +1 -1
- package/dist/utils/hast_utils.js.map +1 -1
- package/dist/utils/hostTheme.d.ts.map +1 -1
- package/dist/utils/hostTheme.js +1 -2
- package/dist/utils/hostTheme.js.map +1 -1
- package/dist/utils/includesFileAnnotations.d.ts +17 -0
- package/dist/utils/includesFileAnnotations.d.ts.map +1 -0
- package/dist/utils/includesFileAnnotations.js +19 -0
- package/dist/utils/includesFileAnnotations.js.map +1 -0
- package/dist/utils/isDefaultRenderRange.d.ts.map +1 -1
- package/dist/utils/isDefaultRenderRange.js +1 -1
- package/dist/utils/isDefaultRenderRange.js.map +1 -1
- package/dist/utils/isDiffPlainText.d.ts.map +1 -1
- package/dist/utils/isDiffPlainText.js +1 -2
- package/dist/utils/isDiffPlainText.js.map +1 -1
- package/dist/utils/isFilePlainText.d.ts.map +1 -1
- package/dist/utils/isFilePlainText.js +1 -2
- package/dist/utils/isFilePlainText.js.map +1 -1
- package/dist/utils/isStyleNode.d.ts.map +1 -1
- package/dist/utils/isStyleNode.js +1 -1
- package/dist/utils/isStyleNode.js.map +1 -1
- package/dist/utils/isWorkerContext.d.ts.map +1 -1
- package/dist/utils/isWorkerContext.js +1 -1
- package/dist/utils/isWorkerContext.js.map +1 -1
- package/dist/utils/iterateOverDiff.d.ts.map +1 -1
- package/dist/utils/iterateOverDiff.js +44 -45
- package/dist/utils/iterateOverDiff.js.map +1 -1
- package/dist/utils/normalizeDiffResolution.d.ts.map +1 -1
- package/dist/utils/normalizeDiffResolution.js +1 -1
- package/dist/utils/normalizeDiffResolution.js.map +1 -1
- package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
- package/dist/utils/parseDiffDecorations.js +1 -2
- package/dist/utils/parseDiffDecorations.js.map +1 -1
- package/dist/utils/parseDiffFromFile.d.ts +0 -1
- package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
- package/dist/utils/parseDiffFromFile.js +1 -2
- package/dist/utils/parseDiffFromFile.js.map +1 -1
- package/dist/utils/parseLineType.d.ts.map +1 -1
- package/dist/utils/parseLineType.js +1 -1
- package/dist/utils/parseLineType.js.map +1 -1
- package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -1
- package/dist/utils/parseMergeConflictDiffFromFile.js +5 -5
- package/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -1
- package/dist/utils/parsePatchFiles.d.ts.map +1 -1
- package/dist/utils/parsePatchFiles.js +6 -7
- package/dist/utils/parsePatchFiles.js.map +1 -1
- package/dist/utils/prefersReducedMotion.d.ts.map +1 -1
- package/dist/utils/prefersReducedMotion.js +1 -1
- package/dist/utils/prefersReducedMotion.js.map +1 -1
- package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -1
- package/dist/utils/prerenderHTMLIfNecessary.js +1 -1
- package/dist/utils/prerenderHTMLIfNecessary.js.map +1 -1
- package/dist/utils/processLine.d.ts +1 -1
- package/dist/utils/processLine.d.ts.map +1 -1
- package/dist/utils/processLine.js +1 -2
- package/dist/utils/processLine.js.map +1 -1
- package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
- package/dist/utils/renderDiffWithHighlighter.js +8 -7
- package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
- package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
- package/dist/utils/renderFileWithHighlighter.js +5 -4
- package/dist/utils/renderFileWithHighlighter.js.map +1 -1
- package/dist/utils/resolveConflict.d.ts.map +1 -1
- package/dist/utils/resolveConflict.js +1 -2
- package/dist/utils/resolveConflict.js.map +1 -1
- package/dist/utils/resolveRegion.d.ts.map +1 -1
- package/dist/utils/resolveRegion.js +1 -1
- package/dist/utils/resolveRegion.js.map +1 -1
- package/dist/utils/roundToDevicePixel.d.ts.map +1 -1
- package/dist/utils/roundToDevicePixel.js +1 -1
- package/dist/utils/roundToDevicePixel.js.map +1 -1
- package/dist/utils/scrollbarGutter.d.ts.map +1 -1
- package/dist/utils/scrollbarGutter.js +1 -2
- package/dist/utils/scrollbarGutter.js.map +1 -1
- package/dist/utils/setLanguageOverride.d.ts.map +1 -1
- package/dist/utils/setLanguageOverride.js +1 -1
- package/dist/utils/setLanguageOverride.js.map +1 -1
- package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
- package/dist/utils/setWrapperNodeProps.js +1 -1
- package/dist/utils/setWrapperNodeProps.js.map +1 -1
- package/dist/utils/shouldUseTokenTransformer.d.ts.map +1 -1
- package/dist/utils/shouldUseTokenTransformer.js +1 -1
- package/dist/utils/shouldUseTokenTransformer.js.map +1 -1
- package/dist/utils/splitFileContents.d.ts.map +1 -1
- package/dist/utils/splitFileContents.js +1 -2
- package/dist/utils/splitFileContents.js.map +1 -1
- package/dist/utils/trimPatchContext.d.ts.map +1 -1
- package/dist/utils/trimPatchContext.js +1 -2
- package/dist/utils/trimPatchContext.js.map +1 -1
- package/dist/utils/updateDiffHunks.d.ts +2 -1
- package/dist/utils/updateDiffHunks.d.ts.map +1 -1
- package/dist/utils/updateDiffHunks.js +22 -3
- package/dist/utils/updateDiffHunks.js.map +1 -1
- package/dist/utils/virtualDiffLayout.d.ts.map +1 -1
- package/dist/utils/virtualDiffLayout.js +1 -2
- package/dist/utils/virtualDiffLayout.js.map +1 -1
- package/dist/utils/wrapTokenFragments.d.ts +1 -1
- package/dist/utils/wrapTokenFragments.d.ts.map +1 -1
- package/dist/utils/wrapTokenFragments.js +1 -2
- package/dist/utils/wrapTokenFragments.js.map +1 -1
- package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
- package/dist/worker/WorkerPoolManager.js +5 -5
- package/dist/worker/WorkerPoolManager.js.map +1 -1
- package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -1
- package/dist/worker/getOrCreateWorkerPoolSingleton.js +1 -2
- package/dist/worker/getOrCreateWorkerPoolSingleton.js.map +1 -1
- package/dist/worker/index.js +1 -2
- package/dist/worker/types.d.ts.map +1 -1
- package/dist/worker/wasm-B9ZqxnKj.js +8 -0
- package/dist/worker/wasm-B9ZqxnKj.js.map +1 -0
- package/dist/worker/worker-portable.js +2989 -6577
- package/dist/worker/worker-portable.js.map +1 -1
- package/dist/worker/worker.js +97 -127
- package/dist/worker/worker.js.map +1 -1
- package/package.json +14 -21
- package/dist/worker/wasm-BaDzIkIn.js +0 -10
- package/dist/worker/wasm-BaDzIkIn.js.map +0 -1
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
//#region src/editor/platform.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Clears the cached platform/browser detection. Detection is memoized on first
|
|
4
|
+
* call, so a test process that swaps `navigator` (e.g. to exercise Linux or
|
|
5
|
+
* Safari behavior) must reset it; otherwise the value cached by an earlier test
|
|
6
|
+
* leaks across tests and no longer matches the active navigator.
|
|
7
|
+
*/
|
|
8
|
+
declare function resetPlatformDetectionForTests(): void;
|
|
2
9
|
declare function isMacLike(): boolean;
|
|
3
10
|
declare function isLinux(): boolean;
|
|
4
11
|
declare function isSafari(): boolean;
|
|
@@ -8,5 +15,5 @@ declare function isPrimaryModifier({
|
|
|
8
15
|
}: MouseEvent | KeyboardEvent, isMac?: boolean): boolean;
|
|
9
16
|
declare function isMoveCursorShortcut(e: KeyboardEvent): 'up' | 'down' | 'left' | 'right' | 'start' | 'textStart' | 'end' | undefined;
|
|
10
17
|
//#endregion
|
|
11
|
-
export { isLinux, isMacLike, isMoveCursorShortcut, isPrimaryModifier, isSafari };
|
|
18
|
+
export { isLinux, isMacLike, isMoveCursorShortcut, isPrimaryModifier, isSafari, resetPlatformDetectionForTests };
|
|
12
19
|
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.d.ts","names":[
|
|
1
|
+
{"version":3,"file":"platform.d.ts","names":[],"sources":["../../src/editor/platform.ts"],"mappings":";;AAUA;;;;AAA8C;iBAA9B,8BAAA;AAAA,iBAMA,SAAA;AAAA,iBAMA,OAAA;AAAA,iBAIA,QAAA;AAAA,iBAMA,iBAAA;EACZ,OAAA;EAAS;AAAA,GAAW,UAAA,GAAa,aAAA,EACnC,KAAA;AAAA,iBAKc,oBAAA,CACd,CAAgB,EAAb,aAAa"}
|
package/dist/editor/platform.js
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
let _isMacLike = void 0;
|
|
3
3
|
let _isLinux = void 0;
|
|
4
4
|
let _isSafari = void 0;
|
|
5
|
+
/**
|
|
6
|
+
* Clears the cached platform/browser detection. Detection is memoized on first
|
|
7
|
+
* call, so a test process that swaps `navigator` (e.g. to exercise Linux or
|
|
8
|
+
* Safari behavior) must reset it; otherwise the value cached by an earlier test
|
|
9
|
+
* leaks across tests and no longer matches the active navigator.
|
|
10
|
+
*/
|
|
11
|
+
function resetPlatformDetectionForTests() {
|
|
12
|
+
_isMacLike = void 0;
|
|
13
|
+
_isLinux = void 0;
|
|
14
|
+
_isSafari = void 0;
|
|
15
|
+
}
|
|
5
16
|
function isMacLike() {
|
|
6
17
|
return _isMacLike ??= /macOS|MacIntel|iPhone|iPad|iPod/i.test(getPlatform());
|
|
7
18
|
}
|
|
@@ -15,7 +26,7 @@ function isPrimaryModifier({ metaKey, ctrlKey }, isMac = isMacLike()) {
|
|
|
15
26
|
return isMac ? metaKey && !ctrlKey : ctrlKey && !metaKey;
|
|
16
27
|
}
|
|
17
28
|
function isMoveCursorShortcut(e) {
|
|
18
|
-
if (
|
|
29
|
+
if (isMacLike() && e.ctrlKey && !e.altKey && !e.metaKey) switch (e.key) {
|
|
19
30
|
case "a": return "start";
|
|
20
31
|
case "e": return "end";
|
|
21
32
|
case "p": return "up";
|
|
@@ -35,10 +46,10 @@ function isMoveCursorShortcut(e) {
|
|
|
35
46
|
}
|
|
36
47
|
}
|
|
37
48
|
function getPlatform() {
|
|
38
|
-
const navigator
|
|
39
|
-
return navigator
|
|
49
|
+
const navigator = globalThis.navigator;
|
|
50
|
+
return navigator?.platform ?? navigator?.userAgentData?.platform ?? "unknown";
|
|
40
51
|
}
|
|
41
|
-
|
|
42
52
|
//#endregion
|
|
43
|
-
export { isLinux, isMacLike, isMoveCursorShortcut, isPrimaryModifier, isSafari };
|
|
53
|
+
export { isLinux, isMacLike, isMoveCursorShortcut, isPrimaryModifier, isSafari, resetPlatformDetectionForTests };
|
|
54
|
+
|
|
44
55
|
//# sourceMappingURL=platform.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.js","names":[
|
|
1
|
+
{"version":3,"file":"platform.js","names":[],"sources":["../../src/editor/platform.ts"],"sourcesContent":["let _isMacLike: boolean | undefined = undefined;\nlet _isLinux: boolean | undefined = undefined;\nlet _isSafari: boolean | undefined = undefined;\n\n/**\n * Clears the cached platform/browser detection. Detection is memoized on first\n * call, so a test process that swaps `navigator` (e.g. to exercise Linux or\n * Safari behavior) must reset it; otherwise the value cached by an earlier test\n * leaks across tests and no longer matches the active navigator.\n */\nexport function resetPlatformDetectionForTests(): void {\n _isMacLike = undefined;\n _isLinux = undefined;\n _isSafari = undefined;\n}\n\nexport function isMacLike(): boolean {\n return (_isMacLike ??= /macOS|MacIntel|iPhone|iPad|iPod/i.test(\n getPlatform()\n ));\n}\n\nexport function isLinux(): boolean {\n return (_isLinux ??= /Linux/i.test(getPlatform()));\n}\n\nexport function isSafari(): boolean {\n return (_isSafari ??=\n ('safari' in window && 'pushNotification' in (window as any).safari) ||\n /^((?!chrome|android).)*safari/i.test(navigator.userAgent));\n}\n\nexport function isPrimaryModifier(\n { metaKey, ctrlKey }: MouseEvent | KeyboardEvent,\n isMac: boolean = isMacLike()\n): boolean {\n return isMac ? metaKey && !ctrlKey : ctrlKey && !metaKey;\n}\n\nexport function isMoveCursorShortcut(\n e: KeyboardEvent\n):\n | 'up'\n | 'down'\n | 'left'\n | 'right'\n | 'start'\n | 'textStart'\n | 'end'\n | undefined {\n // emacs key bindings\n if (isMacLike() && e.ctrlKey && !e.altKey && !e.metaKey) {\n switch (e.key) {\n case 'a':\n return 'start';\n case 'e':\n return 'end';\n case 'p':\n return 'up';\n case 'n':\n return 'down';\n case 'f':\n return 'right';\n case 'b':\n return 'left';\n }\n }\n\n if (!e.altKey && !e.ctrlKey && !e.metaKey) {\n if (e.key === 'ArrowUp') {\n return 'up';\n } else if (e.key === 'ArrowDown') {\n return 'down';\n } else if (e.key === 'ArrowLeft') {\n return 'left';\n } else if (e.key === 'ArrowRight') {\n return 'right';\n }\n }\n\n if (isPrimaryModifier(e)) {\n if (e.key === 'ArrowLeft') {\n return 'textStart';\n } else if (e.key === 'ArrowRight') {\n return 'end';\n }\n }\n\n return undefined;\n}\n\nfunction getPlatform(): string {\n const navigator = globalThis.navigator as Navigator & {\n userAgentData?: { platform?: string };\n };\n return navigator?.platform ?? navigator?.userAgentData?.platform ?? 'unknown';\n}\n"],"mappings":";AAAA,IAAI,aAAkC,KAAA;AACtC,IAAI,WAAgC,KAAA;AACpC,IAAI,YAAiC,KAAA;;;;;;;AAQrC,SAAgB,iCAAuC;CACrD,aAAa,KAAA;CACb,WAAW,KAAA;CACX,YAAY,KAAA;AACd;AAEA,SAAgB,YAAqB;CACnC,OAAQ,eAAe,mCAAmC,KACxD,YAAY,CACd;AACF;AAEA,SAAgB,UAAmB;CACjC,OAAQ,aAAa,SAAS,KAAK,YAAY,CAAC;AAClD;AAEA,SAAgB,WAAoB;CAClC,OAAQ,cACL,YAAY,UAAU,sBAAuB,OAAe,UAC7D,iCAAiC,KAAK,UAAU,SAAS;AAC7D;AAEA,SAAgB,kBACd,EAAE,SAAS,WACX,QAAiB,UAAU,GAClB;CACT,OAAO,QAAQ,WAAW,CAAC,UAAU,WAAW,CAAC;AACnD;AAEA,SAAgB,qBACd,GASY;CAEZ,IAAI,UAAU,KAAK,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,SAC9C,QAAQ,EAAE,KAAV;EACE,KAAK,KACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,KACH,OAAO;CACX;CAGF,IAAI,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE;MAC5B,EAAE,QAAQ,WACZ,OAAO;OACF,IAAI,EAAE,QAAQ,aACnB,OAAO;OACF,IAAI,EAAE,QAAQ,aACnB,OAAO;OACF,IAAI,EAAE,QAAQ,cACnB,OAAO;CAAA;CAIX,IAAI,kBAAkB,CAAC;MACjB,EAAE,QAAQ,aACZ,OAAO;OACF,IAAI,EAAE,QAAQ,cACnB,OAAO;CAAA;AAKb;AAEA,SAAS,cAAsB;CAC7B,MAAM,YAAY,WAAW;CAG7B,OAAO,WAAW,YAAY,WAAW,eAAe,YAAY;AACtE"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { TextDocument } from "./textDocument.js";
|
|
1
|
+
import { ResolvedTextEdit, TextDocument } from "./textDocument.js";
|
|
2
2
|
|
|
3
3
|
//#region src/editor/searchPanel.d.ts
|
|
4
4
|
type MatchRange = [startOffset: number, endOffset: number];
|
|
5
|
+
type SearchPanelMode = 'find' | 'replace';
|
|
5
6
|
interface SearchParams {
|
|
6
7
|
text: string;
|
|
7
8
|
replaceText: string;
|
|
@@ -13,17 +14,26 @@ interface SearchPanelOptions {
|
|
|
13
14
|
textDocument: TextDocument<unknown>;
|
|
14
15
|
containerElement: HTMLElement;
|
|
15
16
|
defaultQuery: string;
|
|
17
|
+
mode?: SearchPanelMode;
|
|
16
18
|
initialMatch?: MatchRange;
|
|
17
19
|
scrollToMatch: (nextMatch: MatchRange, retainFocus: boolean) => void;
|
|
18
|
-
|
|
20
|
+
applyReplace: (edits: ResolvedTextEdit[]) => void;
|
|
21
|
+
onUpdate: (matches: MatchRange[], options?: {
|
|
22
|
+
syncSelection?: boolean;
|
|
23
|
+
}) => MatchRange | undefined;
|
|
19
24
|
onClose: () => void;
|
|
20
25
|
}
|
|
21
26
|
declare class SearchPanelWidget {
|
|
22
27
|
#private;
|
|
23
28
|
constructor(options: SearchPanelOptions);
|
|
24
29
|
focus(): void;
|
|
30
|
+
navigate(findPrevious: boolean): void;
|
|
31
|
+
updateMatches(options?: {
|
|
32
|
+
syncSelection?: boolean;
|
|
33
|
+
}): void;
|
|
34
|
+
setMode(mode: SearchPanelMode): void;
|
|
25
35
|
cleanup(): void;
|
|
26
36
|
}
|
|
27
37
|
//#endregion
|
|
28
|
-
export { MatchRange, SearchPanelOptions, SearchPanelWidget, SearchParams };
|
|
38
|
+
export { MatchRange, SearchPanelMode, SearchPanelOptions, SearchPanelWidget, SearchParams };
|
|
29
39
|
//# sourceMappingURL=searchPanel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchPanel.d.ts","names":[
|
|
1
|
+
{"version":3,"file":"searchPanel.d.ts","names":[],"sources":["../../src/editor/searchPanel.ts"],"mappings":";;;KAOY,UAAA,IAAc,WAAA,UAAqB,SAAS;AAAA,KAE5C,eAAA;AAAA,UAEK,YAAA;EACf,IAAA;EACA,WAAA;EACA,aAAA;EACA,SAAA;EACA,KAAA;AAAA;AAAA,UAGe,kBAAA;EACf,YAAA,EAAc,YAAA;EACd,gBAAA,EAAkB,WAAA;EAClB,YAAA;EACA,IAAA,GAAO,eAAA;EACP,YAAA,GAAe,UAAA;EACf,aAAA,GAAgB,SAAA,EAAW,UAAA,EAAY,WAAA;EACvC,YAAA,GAAe,KAAA,EAAO,gBAAA;EACtB,QAAA,GACE,OAAA,EAAS,UAAA,IACT,OAAA;IAAY,aAAA;EAAA,MACT,UAAA;EACL,OAAA;AAAA;AAAA,cAGW,iBAAA;EAAA;EAOX,WAAA,CAAY,OAAA,EAAS,kBAAA;EAuYrB,KAAA;EAIA,QAAA,CAAS,YAAA;EAIT,aAAA,CAAc,OAAA;IAAY,aAAA;EAAA;EAI1B,OAAA,CAAQ,IAAA,EAAM,eAAe;EAI7B,OAAA;AAAA"}
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import { isPrimaryModifier } from "./platform.js";
|
|
2
|
+
import { resolveFindAgainShortcut } from "./command.js";
|
|
2
3
|
import { h } from "./utils.js";
|
|
4
|
+
import { buildSearchReplacementText } from "./pieceTable.js";
|
|
3
5
|
import { getEditorIconSvg } from "./sprite.js";
|
|
4
|
-
|
|
5
6
|
//#region src/editor/searchPanel.ts
|
|
6
7
|
var SearchPanelWidget = class {
|
|
7
8
|
#container;
|
|
8
9
|
#inputElement;
|
|
10
|
+
#updateMatches;
|
|
11
|
+
#applyMode;
|
|
12
|
+
#navigate;
|
|
9
13
|
constructor(options) {
|
|
10
|
-
const { textDocument, containerElement, defaultQuery, initialMatch, scrollToMatch, onUpdate, onClose } = options;
|
|
14
|
+
const { textDocument, containerElement, defaultQuery, mode = "find", initialMatch, scrollToMatch, applyReplace, onUpdate, onClose } = options;
|
|
11
15
|
const searchParams = {
|
|
12
16
|
text: defaultQuery,
|
|
13
17
|
replaceText: "",
|
|
@@ -19,28 +23,38 @@ var SearchPanelWidget = class {
|
|
|
19
23
|
all: [],
|
|
20
24
|
current: void 0
|
|
21
25
|
};
|
|
22
|
-
const matchResultElement = h("div", {
|
|
23
|
-
|
|
26
|
+
const matchResultElement = h("div", {
|
|
27
|
+
dataset: {
|
|
28
|
+
matches: "",
|
|
29
|
+
noMatches: ""
|
|
30
|
+
},
|
|
31
|
+
textContent: "No results"
|
|
32
|
+
});
|
|
33
|
+
const updateMatches = (options) => {
|
|
24
34
|
matches.all = searchParams.text !== "" ? textDocument.search(searchParams) : [];
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
35
|
+
const noMatches = matches.all.length === 0;
|
|
36
|
+
prevButton.disabled = noMatches;
|
|
37
|
+
nextButton.disabled = noMatches;
|
|
28
38
|
if (searchParams.text === "") {
|
|
29
|
-
matchResultElement.textContent = "";
|
|
30
|
-
|
|
39
|
+
matchResultElement.textContent = "No results";
|
|
40
|
+
matchResultElement.dataset.noMatches = "";
|
|
31
41
|
return;
|
|
32
42
|
}
|
|
33
43
|
if (matches.all.length === 0) {
|
|
34
44
|
matchResultElement.textContent = "No results";
|
|
35
45
|
matchResultElement.dataset.noMatches = "";
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
updateCurrentMatch(onUpdate(matches.all));
|
|
46
|
+
matches.current = void 0;
|
|
47
|
+
onUpdate([]);
|
|
39
48
|
return;
|
|
40
49
|
}
|
|
41
|
-
|
|
42
|
-
|
|
50
|
+
delete matchResultElement.dataset.noMatches;
|
|
51
|
+
if (options?.syncSelection === false) {
|
|
52
|
+
updateCurrentMatch(onUpdate(matches.all, { syncSelection: false }));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
updateCurrentMatch(onUpdate(matches.all));
|
|
43
56
|
};
|
|
57
|
+
this.#updateMatches = updateMatches;
|
|
44
58
|
const updateCurrentMatch = (currentMatch) => {
|
|
45
59
|
if (currentMatch === void 0) matchResultElement.textContent = `${matches.all.length} results`;
|
|
46
60
|
else {
|
|
@@ -74,29 +88,81 @@ var SearchPanelWidget = class {
|
|
|
74
88
|
}
|
|
75
89
|
matches.current = nextMatch;
|
|
76
90
|
};
|
|
91
|
+
this.#navigate = (findPrevious) => findNextMatch(findPrevious, true);
|
|
92
|
+
const buildReplacementEdit = (matchStart, matchEnd) => ({
|
|
93
|
+
start: matchStart,
|
|
94
|
+
end: matchEnd,
|
|
95
|
+
text: buildSearchReplacementText((offset) => textDocument.positionAt(offset), (position) => textDocument.offsetAt(position), (line) => textDocument.getLineText(line), searchParams, matchStart, matchEnd)
|
|
96
|
+
});
|
|
97
|
+
const replace = () => {
|
|
98
|
+
if (searchParams.text === "" || matches.all.length === 0) return;
|
|
99
|
+
let currentMatch = matches.current;
|
|
100
|
+
if (currentMatch === void 0) {
|
|
101
|
+
findNextMatch(false, true);
|
|
102
|
+
currentMatch = matches.current;
|
|
103
|
+
if (currentMatch === void 0) return;
|
|
104
|
+
}
|
|
105
|
+
const [start, end] = currentMatch;
|
|
106
|
+
const edit = buildReplacementEdit(start, end);
|
|
107
|
+
applyReplace([edit]);
|
|
108
|
+
scrollToMatch([start + edit.text.length, start + edit.text.length], true);
|
|
109
|
+
matches.current = void 0;
|
|
110
|
+
updateMatches();
|
|
111
|
+
};
|
|
112
|
+
const replaceAll = () => {
|
|
113
|
+
if (searchParams.text === "" || matches.all.length === 0) return;
|
|
114
|
+
applyReplace(matches.all.map(([start, end]) => buildReplacementEdit(start, end)));
|
|
115
|
+
matches.current = void 0;
|
|
116
|
+
updateMatches();
|
|
117
|
+
};
|
|
77
118
|
const close = () => {
|
|
78
119
|
this.cleanup();
|
|
79
120
|
onClose();
|
|
80
121
|
};
|
|
122
|
+
const iconButton = (opts) => h("button", {
|
|
123
|
+
type: "button",
|
|
124
|
+
title: opts.label,
|
|
125
|
+
ariaLabel: opts.label,
|
|
126
|
+
dataset: {
|
|
127
|
+
searchIcon: "",
|
|
128
|
+
...opts.dataset
|
|
129
|
+
},
|
|
130
|
+
innerHTML: getEditorIconSvg(opts.icon, opts.size ?? 16),
|
|
131
|
+
onclick: opts.onClick
|
|
132
|
+
});
|
|
81
133
|
const makeToggle = (icon, title, key) => {
|
|
82
|
-
const button =
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
title,
|
|
88
|
-
innerHTML: getEditorIconSvg(icon),
|
|
89
|
-
onclick: () => {
|
|
134
|
+
const button = iconButton({
|
|
135
|
+
icon,
|
|
136
|
+
label: title,
|
|
137
|
+
size: 14,
|
|
138
|
+
onClick: () => {
|
|
90
139
|
const next = !searchParams[key];
|
|
91
|
-
button.
|
|
140
|
+
button.ariaPressed = String(next);
|
|
92
141
|
updateSearchParam(key, next);
|
|
93
142
|
}
|
|
94
143
|
});
|
|
144
|
+
button.ariaPressed = String(searchParams[key]);
|
|
95
145
|
return button;
|
|
96
146
|
};
|
|
97
147
|
const caseSensitiveToggle = makeToggle("case", "Match Case", "caseSensitive");
|
|
98
148
|
const wholeWordToggle = makeToggle("whole-word", "Whole Word", "wholeWord");
|
|
99
149
|
const regexToggle = makeToggle("regex", "Regexp", "regex");
|
|
150
|
+
const replaceInputElement = h("input", {
|
|
151
|
+
type: "text",
|
|
152
|
+
placeholder: "Replace",
|
|
153
|
+
dataset: "replace",
|
|
154
|
+
value: "",
|
|
155
|
+
oninput: (e) => {
|
|
156
|
+
searchParams.replaceText = e.target.value;
|
|
157
|
+
},
|
|
158
|
+
onkeydown: (e) => {
|
|
159
|
+
const findAgain = resolveFindAgainShortcut(e);
|
|
160
|
+
if (findAgain !== void 0) {
|
|
161
|
+
e.preventDefault();
|
|
162
|
+
findNextMatch(findAgain === "previous", true);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
});
|
|
100
166
|
this.#inputElement = h("input", {
|
|
101
167
|
type: "text",
|
|
102
168
|
placeholder: "Search",
|
|
@@ -108,59 +174,111 @@ var SearchPanelWidget = class {
|
|
|
108
174
|
updateMatches();
|
|
109
175
|
},
|
|
110
176
|
onkeydown: (e) => {
|
|
177
|
+
const findAgain = resolveFindAgainShortcut(e);
|
|
111
178
|
if (e.key === "Escape") {
|
|
112
179
|
e.preventDefault();
|
|
113
180
|
close();
|
|
114
181
|
} else if (e.key === "Enter") {
|
|
115
182
|
e.preventDefault();
|
|
116
183
|
findNextMatch(false, true);
|
|
117
|
-
} else if (
|
|
184
|
+
} else if (findAgain !== void 0) {
|
|
185
|
+
e.preventDefault();
|
|
186
|
+
findNextMatch(findAgain === "previous", true);
|
|
187
|
+
} else if (isPrimaryModifier(e) && (e.key === "f" || e.code === "KeyF")) {
|
|
188
|
+
e.preventDefault();
|
|
189
|
+
applyMode(e.altKey ? "replace" : "find");
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
const searchTogglesElement = h("div", {
|
|
194
|
+
dataset: "searchToggles",
|
|
195
|
+
children: [
|
|
196
|
+
caseSensitiveToggle,
|
|
197
|
+
wholeWordToggle,
|
|
198
|
+
regexToggle
|
|
199
|
+
]
|
|
200
|
+
});
|
|
201
|
+
const findInputBox = h("div", {
|
|
202
|
+
dataset: {
|
|
203
|
+
inputBox: "",
|
|
204
|
+
find: ""
|
|
205
|
+
},
|
|
206
|
+
children: [this.#inputElement, searchTogglesElement]
|
|
207
|
+
});
|
|
208
|
+
const replaceInputBox = h("div", {
|
|
209
|
+
dataset: {
|
|
210
|
+
inputBox: "",
|
|
211
|
+
replace: "",
|
|
212
|
+
replaceCell: ""
|
|
213
|
+
},
|
|
214
|
+
children: [replaceInputElement]
|
|
215
|
+
});
|
|
216
|
+
const replaceActionsElement = h("div", {
|
|
217
|
+
dataset: {
|
|
218
|
+
replaceActions: "",
|
|
219
|
+
replaceCell: ""
|
|
220
|
+
},
|
|
221
|
+
children: [iconButton({
|
|
222
|
+
icon: "replace",
|
|
223
|
+
label: "Replace",
|
|
224
|
+
onClick: replace
|
|
225
|
+
}), iconButton({
|
|
226
|
+
icon: "replace-all",
|
|
227
|
+
label: "Replace All",
|
|
228
|
+
onClick: replaceAll
|
|
229
|
+
})]
|
|
230
|
+
});
|
|
231
|
+
const prevButton = iconButton({
|
|
232
|
+
icon: "arrow-up",
|
|
233
|
+
label: "Previous",
|
|
234
|
+
onClick: () => {
|
|
235
|
+
findNextMatch(true);
|
|
118
236
|
}
|
|
119
237
|
});
|
|
238
|
+
const nextButton = iconButton({
|
|
239
|
+
icon: "arrow-down",
|
|
240
|
+
label: "Next",
|
|
241
|
+
onClick: () => {
|
|
242
|
+
findNextMatch();
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
prevButton.disabled = true;
|
|
246
|
+
nextButton.disabled = true;
|
|
247
|
+
const navElement = h("div", {
|
|
248
|
+
dataset: "searchNav",
|
|
249
|
+
children: [prevButton, nextButton]
|
|
250
|
+
});
|
|
251
|
+
const closeElement = iconButton({
|
|
252
|
+
icon: "close",
|
|
253
|
+
label: "Close",
|
|
254
|
+
onClick: close,
|
|
255
|
+
dataset: { searchClose: "" }
|
|
256
|
+
});
|
|
257
|
+
const gridElement = h("div", {
|
|
258
|
+
dataset: {
|
|
259
|
+
searchGrid: "",
|
|
260
|
+
mode
|
|
261
|
+
},
|
|
262
|
+
children: [
|
|
263
|
+
findInputBox,
|
|
264
|
+
replaceInputBox,
|
|
265
|
+
replaceActionsElement,
|
|
266
|
+
matchResultElement,
|
|
267
|
+
navElement,
|
|
268
|
+
closeElement
|
|
269
|
+
]
|
|
270
|
+
});
|
|
271
|
+
const applyMode = (next) => {
|
|
272
|
+
gridElement.dataset.mode = next;
|
|
273
|
+
this.#inputElement.focus();
|
|
274
|
+
this.#inputElement.select();
|
|
275
|
+
};
|
|
276
|
+
this.#applyMode = applyMode;
|
|
120
277
|
this.#container = h("div", {
|
|
121
|
-
dataset:
|
|
278
|
+
dataset: "searchPanel",
|
|
122
279
|
children: [h("div", {
|
|
123
|
-
dataset: "
|
|
124
|
-
children: [
|
|
125
|
-
h("div", {
|
|
126
|
-
dataset: { icon: "search" },
|
|
127
|
-
innerHTML: getEditorIconSvg("search")
|
|
128
|
-
}),
|
|
129
|
-
this.#inputElement,
|
|
130
|
-
matchResultElement,
|
|
131
|
-
caseSensitiveToggle,
|
|
132
|
-
wholeWordToggle,
|
|
133
|
-
regexToggle,
|
|
134
|
-
h("div", { dataset: "divider" }),
|
|
135
|
-
h("div", {
|
|
136
|
-
dataset: {
|
|
137
|
-
icon: "arrow-up",
|
|
138
|
-
disabled: "true"
|
|
139
|
-
},
|
|
140
|
-
title: "Previous",
|
|
141
|
-
innerHTML: getEditorIconSvg("arrow-up"),
|
|
142
|
-
onclick: () => {
|
|
143
|
-
findNextMatch(true);
|
|
144
|
-
}
|
|
145
|
-
}),
|
|
146
|
-
h("div", {
|
|
147
|
-
dataset: {
|
|
148
|
-
icon: "arrow-down",
|
|
149
|
-
disabled: "true"
|
|
150
|
-
},
|
|
151
|
-
title: "Next",
|
|
152
|
-
innerHTML: getEditorIconSvg("arrow-down"),
|
|
153
|
-
onclick: () => {
|
|
154
|
-
findNextMatch();
|
|
155
|
-
}
|
|
156
|
-
}),
|
|
157
|
-
h("div", {
|
|
158
|
-
dataset: { icon: "close" },
|
|
159
|
-
title: "Close",
|
|
160
|
-
innerHTML: getEditorIconSvg("close"),
|
|
161
|
-
onclick: close
|
|
162
|
-
})
|
|
163
|
-
]
|
|
280
|
+
dataset: "editorWidget",
|
|
281
|
+
children: [gridElement]
|
|
164
282
|
})]
|
|
165
283
|
});
|
|
166
284
|
matches.current = initialMatch;
|
|
@@ -174,11 +292,20 @@ var SearchPanelWidget = class {
|
|
|
174
292
|
focus() {
|
|
175
293
|
this.#inputElement.focus();
|
|
176
294
|
}
|
|
295
|
+
navigate(findPrevious) {
|
|
296
|
+
this.#navigate?.(findPrevious);
|
|
297
|
+
}
|
|
298
|
+
updateMatches(options) {
|
|
299
|
+
this.#updateMatches?.(options);
|
|
300
|
+
}
|
|
301
|
+
setMode(mode) {
|
|
302
|
+
this.#applyMode?.(mode);
|
|
303
|
+
}
|
|
177
304
|
cleanup() {
|
|
178
305
|
this.#container.remove();
|
|
179
306
|
}
|
|
180
307
|
};
|
|
181
|
-
|
|
182
308
|
//#endregion
|
|
183
309
|
export { SearchPanelWidget };
|
|
310
|
+
|
|
184
311
|
//# sourceMappingURL=searchPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchPanel.js","names":["searchParams: SearchParams","#container","nextMatch: MatchRange | undefined","#inputElement"],"sources":["../../src/editor/searchPanel.ts"],"sourcesContent":["import { isPrimaryModifier } from './platform';\nimport { getEditorIconSvg, type SVGSpriteNames } from './sprite';\nimport type { TextDocument } from './textDocument';\nimport { h } from './utils';\n\nexport type MatchRange = [startOffset: number, endOffset: number];\n\nexport interface SearchParams {\n text: string;\n replaceText: string;\n caseSensitive: boolean;\n wholeWord: boolean;\n regex: boolean;\n}\n\nexport interface SearchPanelOptions {\n textDocument: TextDocument<unknown>;\n containerElement: HTMLElement;\n defaultQuery: string;\n initialMatch?: MatchRange;\n scrollToMatch: (nextMatch: MatchRange, retainFocus: boolean) => void;\n onUpdate: (matches: MatchRange[]) => MatchRange | undefined;\n onClose: () => void;\n}\n\nexport class SearchPanelWidget {\n #container: HTMLDivElement;\n #inputElement: HTMLInputElement;\n\n constructor(options: SearchPanelOptions) {\n const {\n textDocument,\n containerElement,\n defaultQuery,\n initialMatch,\n scrollToMatch,\n onUpdate,\n onClose,\n } = options;\n\n const searchParams: SearchParams = {\n text: defaultQuery,\n replaceText: '',\n caseSensitive: false,\n wholeWord: false,\n regex: false,\n };\n\n const matches = {\n all: [] as MatchRange[],\n current: undefined as MatchRange | undefined,\n };\n\n const matchResultElement = h('div', { dataset: 'matches' });\n const updateMatches = () => {\n matches.all =\n searchParams.text !== '' ? textDocument.search(searchParams) : [];\n this.#container\n .querySelectorAll<HTMLElement>('[data-disabled]')\n .forEach((element) => {\n element.dataset.disabled = String(matches.all.length === 0);\n });\n\n if (searchParams.text === '') {\n matchResultElement.textContent = '';\n delete matchResultElement.dataset.noMatches;\n return;\n }\n\n if (matches.all.length === 0) {\n matchResultElement.textContent = 'No results';\n matchResultElement.dataset.noMatches = '';\n } else {\n delete matchResultElement.dataset.noMatches;\n updateCurrentMatch(onUpdate(matches.all));\n return;\n }\n\n matches.current = undefined;\n onUpdate([]);\n };\n\n const updateCurrentMatch = (currentMatch: MatchRange | undefined) => {\n if (currentMatch === undefined) {\n matchResultElement.textContent = `${matches.all.length} results`;\n } else {\n const [start, end] = currentMatch;\n const index = matches.all.findIndex(\n (m) => m[0] === start && m[1] === end\n );\n matchResultElement.textContent = `${index + 1} of ${matches.all.length}`;\n }\n matches.current = currentMatch;\n };\n\n const updateSearchParam = <K extends keyof SearchParams>(\n key: K,\n value: SearchParams[K]\n ) => {\n searchParams[key] = value;\n updateMatches();\n };\n\n const findNextMatch = (\n findPrevious: boolean = false,\n retainFocus: boolean = false\n ) => {\n const allMatches = matches.all;\n let nextMatch: MatchRange | undefined = allMatches[0];\n if (allMatches.length > 0) {\n if (findPrevious) {\n const searchOffset = matches.current?.[0] ?? 0;\n nextMatch = allMatches.at(-1);\n for (const m of allMatches) {\n if (m[1] <= searchOffset) {\n nextMatch = m;\n } else {\n break;\n }\n }\n } else {\n const searchOffset = matches.current?.[1] ?? 0;\n for (const m of allMatches) {\n if (m[0] >= searchOffset) {\n nextMatch = m;\n break;\n }\n }\n }\n }\n if (nextMatch !== undefined) {\n updateCurrentMatch(nextMatch);\n scrollToMatch(nextMatch, retainFocus);\n }\n matches.current = nextMatch;\n };\n\n const close = () => {\n this.cleanup();\n onClose();\n };\n\n // Builds an always-visible icon button that toggles one boolean search\n // option (case/whole-word/regex). The button reflects its on/off state via\n // the `data-active` attribute so the stylesheet can highlight it.\n const makeToggle = (\n icon: SVGSpriteNames,\n title: string,\n key: 'caseSensitive' | 'wholeWord' | 'regex'\n ) => {\n const button = h('div', {\n dataset: { icon, active: String(searchParams[key]) },\n title,\n innerHTML: getEditorIconSvg(icon),\n onclick: () => {\n const next = !searchParams[key];\n button.dataset.active = String(next);\n updateSearchParam(key, next);\n },\n });\n return button;\n };\n\n const caseSensitiveToggle = makeToggle(\n 'case',\n 'Match Case',\n 'caseSensitive'\n );\n const wholeWordToggle = makeToggle('whole-word', 'Whole Word', 'wholeWord');\n const regexToggle = makeToggle('regex', 'Regexp', 'regex');\n\n this.#inputElement = h('input', {\n type: 'text',\n placeholder: 'Search',\n dataset: 'search',\n value: defaultQuery,\n oninput: (e: Event) => {\n searchParams.text = (e.target as HTMLInputElement).value;\n matches.current = undefined;\n updateMatches();\n },\n onkeydown: (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n close();\n } else if (e.key === 'Enter') {\n e.preventDefault();\n findNextMatch(false, true);\n } else if (e.key === 'f' && isPrimaryModifier(e)) {\n // prevent the default browser search panel open behavior\n e.preventDefault();\n }\n },\n });\n\n this.#container = h('div', {\n dataset: ['searchPanel', 'editorWidget'],\n children: [\n h('div', {\n dataset: 'searchPanelRow',\n children: [\n h('div', {\n dataset: { icon: 'search' },\n innerHTML: getEditorIconSvg('search'),\n }),\n this.#inputElement,\n matchResultElement,\n caseSensitiveToggle,\n wholeWordToggle,\n regexToggle,\n h('div', { dataset: 'divider' }),\n h('div', {\n dataset: { icon: 'arrow-up', disabled: 'true' },\n title: 'Previous',\n innerHTML: getEditorIconSvg('arrow-up'),\n onclick: () => {\n findNextMatch(true);\n },\n }),\n h('div', {\n dataset: { icon: 'arrow-down', disabled: 'true' },\n title: 'Next',\n innerHTML: getEditorIconSvg('arrow-down'),\n onclick: () => {\n findNextMatch();\n },\n }),\n h('div', {\n dataset: { icon: 'close' },\n title: 'Close',\n innerHTML: getEditorIconSvg('close'),\n onclick: close,\n }),\n ],\n }),\n ],\n });\n\n matches.current = initialMatch;\n containerElement.before(this.#container);\n\n requestAnimationFrame(() => {\n if (initialMatch !== undefined) {\n updateMatches();\n } else {\n onUpdate([]);\n }\n this.#inputElement.select();\n });\n }\n\n focus(): void {\n this.#inputElement.focus();\n }\n\n cleanup(): void {\n this.#container.remove();\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"searchPanel.js","names":["#updateMatches","#navigate","#inputElement","#applyMode","#container"],"sources":["../../src/editor/searchPanel.ts"],"sourcesContent":["import { resolveFindAgainShortcut } from './command';\nimport { buildSearchReplacementText } from './pieceTable';\nimport { isPrimaryModifier } from './platform';\nimport { getEditorIconSvg, type SVGSpriteNames } from './sprite';\nimport type { ResolvedTextEdit, TextDocument } from './textDocument';\nimport { h } from './utils';\n\nexport type MatchRange = [startOffset: number, endOffset: number];\n\nexport type SearchPanelMode = 'find' | 'replace';\n\nexport interface SearchParams {\n text: string;\n replaceText: string;\n caseSensitive: boolean;\n wholeWord: boolean;\n regex: boolean;\n}\n\nexport interface SearchPanelOptions {\n textDocument: TextDocument<unknown>;\n containerElement: HTMLElement;\n defaultQuery: string;\n mode?: SearchPanelMode;\n initialMatch?: MatchRange;\n scrollToMatch: (nextMatch: MatchRange, retainFocus: boolean) => void;\n applyReplace: (edits: ResolvedTextEdit[]) => void;\n onUpdate: (\n matches: MatchRange[],\n options?: { syncSelection?: boolean }\n ) => MatchRange | undefined;\n onClose: () => void;\n}\n\nexport class SearchPanelWidget {\n #container: HTMLDivElement;\n #inputElement: HTMLInputElement;\n #updateMatches?: (options?: { syncSelection?: boolean }) => void;\n #applyMode?: (mode: SearchPanelMode) => void;\n #navigate?: (findPrevious: boolean) => void;\n\n constructor(options: SearchPanelOptions) {\n const {\n textDocument,\n containerElement,\n defaultQuery,\n mode = 'find',\n initialMatch,\n scrollToMatch,\n applyReplace,\n onUpdate,\n onClose,\n } = options;\n\n const searchParams: SearchParams = {\n text: defaultQuery,\n replaceText: '',\n caseSensitive: false,\n wholeWord: false,\n regex: false,\n };\n\n const matches = {\n all: [] as MatchRange[],\n current: undefined as MatchRange | undefined,\n };\n\n // Default to the empty-query \"no results\" state so it shows on open before\n // any search runs.\n const matchResultElement = h('div', {\n dataset: { matches: '', noMatches: '' },\n textContent: 'No results',\n });\n const updateMatches = (options?: { syncSelection?: boolean }) => {\n matches.all =\n searchParams.text !== '' ? textDocument.search(searchParams) : [];\n const noMatches = matches.all.length === 0;\n prevButton.disabled = noMatches;\n nextButton.disabled = noMatches;\n\n if (searchParams.text === '') {\n matchResultElement.textContent = 'No results';\n matchResultElement.dataset.noMatches = '';\n return;\n }\n\n if (matches.all.length === 0) {\n matchResultElement.textContent = 'No results';\n matchResultElement.dataset.noMatches = '';\n matches.current = undefined;\n onUpdate([]);\n return;\n }\n\n delete matchResultElement.dataset.noMatches;\n if (options?.syncSelection === false) {\n const currentMatch = onUpdate(matches.all, { syncSelection: false });\n updateCurrentMatch(currentMatch);\n return;\n }\n\n updateCurrentMatch(onUpdate(matches.all));\n };\n this.#updateMatches = updateMatches;\n\n const updateCurrentMatch = (currentMatch: MatchRange | undefined) => {\n if (currentMatch === undefined) {\n matchResultElement.textContent = `${matches.all.length} results`;\n } else {\n const [start, end] = currentMatch;\n const index = matches.all.findIndex(\n (m) => m[0] === start && m[1] === end\n );\n matchResultElement.textContent = `${index + 1} of ${matches.all.length}`;\n }\n matches.current = currentMatch;\n };\n\n const updateSearchParam = <K extends keyof SearchParams>(\n key: K,\n value: SearchParams[K]\n ) => {\n searchParams[key] = value;\n updateMatches();\n };\n\n const findNextMatch = (\n findPrevious: boolean = false,\n retainFocus: boolean = false\n ) => {\n const allMatches = matches.all;\n let nextMatch: MatchRange | undefined = allMatches[0];\n if (allMatches.length > 0) {\n if (findPrevious) {\n const searchOffset = matches.current?.[0] ?? 0;\n nextMatch = allMatches.at(-1);\n for (const m of allMatches) {\n if (m[1] <= searchOffset) {\n nextMatch = m;\n } else {\n break;\n }\n }\n } else {\n const searchOffset = matches.current?.[1] ?? 0;\n for (const m of allMatches) {\n if (m[0] >= searchOffset) {\n nextMatch = m;\n break;\n }\n }\n }\n }\n if (nextMatch !== undefined) {\n updateCurrentMatch(nextMatch);\n scrollToMatch(nextMatch, retainFocus);\n }\n matches.current = nextMatch;\n };\n // Keep focus in the panel when stepping through matches from the inputs.\n this.#navigate = (findPrevious: boolean) =>\n findNextMatch(findPrevious, true);\n\n const buildReplacementEdit = (\n matchStart: number,\n matchEnd: number\n ): ResolvedTextEdit => ({\n start: matchStart,\n end: matchEnd,\n text: buildSearchReplacementText(\n (offset) => textDocument.positionAt(offset),\n (position) => textDocument.offsetAt(position),\n (line) => textDocument.getLineText(line),\n searchParams,\n matchStart,\n matchEnd\n ),\n });\n\n const replace = () => {\n if (searchParams.text === '' || matches.all.length === 0) {\n return;\n }\n\n let currentMatch = matches.current;\n if (currentMatch === undefined) {\n findNextMatch(false, true);\n currentMatch = matches.current;\n if (currentMatch === undefined) {\n return;\n }\n }\n\n const [start, end] = currentMatch;\n const edit = buildReplacementEdit(start, end);\n applyReplace([edit]);\n\n // Collapse after the replacement so the next search pass advances.\n scrollToMatch([start + edit.text.length, start + edit.text.length], true);\n matches.current = undefined;\n updateMatches();\n };\n\n const replaceAll = () => {\n if (searchParams.text === '' || matches.all.length === 0) {\n return;\n }\n\n applyReplace(\n matches.all.map(([start, end]) => buildReplacementEdit(start, end))\n );\n matches.current = undefined;\n updateMatches();\n };\n\n const close = () => {\n this.cleanup();\n onClose();\n };\n\n // Shared builder for the panel's icon controls. Every clickable control is a\n // real <button> so it gets focus, keyboard activation, and native disabled\n // handling for free; `getEditorIconSvg` marks the glyph aria-hidden, so the\n // accessible name comes from `label` (also used as the hover title).\n const iconButton = (opts: {\n icon: SVGSpriteNames;\n label: string;\n size?: number;\n dataset?: Record<string, string>;\n onClick: () => void;\n }) =>\n h('button', {\n type: 'button',\n title: opts.label,\n ariaLabel: opts.label,\n dataset: { searchIcon: '', ...opts.dataset },\n innerHTML: getEditorIconSvg(opts.icon, opts.size ?? 16),\n onclick: opts.onClick,\n });\n\n // Builds an always-visible icon button that toggles one boolean search\n // option (case/whole-word/regex). The button reflects its on/off state via\n // `aria-pressed` so the stylesheet can highlight it and assistive tech can\n // announce it.\n const makeToggle = (\n icon: SVGSpriteNames,\n title: string,\n key: 'caseSensitive' | 'wholeWord' | 'regex'\n ) => {\n const button = iconButton({\n icon,\n label: title,\n size: 14,\n onClick: () => {\n const next = !searchParams[key];\n button.ariaPressed = String(next);\n updateSearchParam(key, next);\n },\n });\n button.ariaPressed = String(searchParams[key]);\n return button;\n };\n\n const caseSensitiveToggle = makeToggle(\n 'case',\n 'Match Case',\n 'caseSensitive'\n );\n const wholeWordToggle = makeToggle('whole-word', 'Whole Word', 'wholeWord');\n const regexToggle = makeToggle('regex', 'Regexp', 'regex');\n\n const replaceInputElement = h('input', {\n type: 'text',\n placeholder: 'Replace',\n dataset: 'replace',\n value: '',\n oninput: (e: Event) => {\n searchParams.replaceText = (e.target as HTMLInputElement).value;\n },\n onkeydown: (e: KeyboardEvent) => {\n const findAgain = resolveFindAgainShortcut(e);\n if (findAgain !== undefined) {\n e.preventDefault();\n findNextMatch(findAgain === 'previous', true);\n }\n },\n });\n\n this.#inputElement = h('input', {\n type: 'text',\n placeholder: 'Search',\n dataset: 'search',\n value: defaultQuery,\n oninput: (e: Event) => {\n searchParams.text = (e.target as HTMLInputElement).value;\n matches.current = undefined;\n updateMatches();\n },\n onkeydown: (e: KeyboardEvent) => {\n const findAgain = resolveFindAgainShortcut(e);\n if (e.key === 'Escape') {\n e.preventDefault();\n close();\n } else if (e.key === 'Enter') {\n e.preventDefault();\n findNextMatch(false, true);\n } else if (findAgain !== undefined) {\n // Override the native browser find-again shortcut so cmd+g steps to\n // the next match and cmd+shift+g to the previous one.\n e.preventDefault();\n findNextMatch(findAgain === 'previous', true);\n } else if (\n isPrimaryModifier(e) &&\n (e.key === 'f' || e.code === 'KeyF')\n ) {\n // Prevent the default browser search panel and switch the panel mode\n // in place (cmd+f -> find, cmd+opt+f -> find/replace).\n e.preventDefault();\n applyMode(e.altKey ? 'replace' : 'find');\n }\n },\n });\n\n // The three search-option toggles are overlaid on the right edge of the\n // find input instead of sitting beside it.\n const searchTogglesElement = h('div', {\n dataset: 'searchToggles',\n children: [caseSensitiveToggle, wholeWordToggle, regexToggle],\n });\n\n const findInputBox = h('div', {\n dataset: { inputBox: '', find: '' },\n children: [this.#inputElement, searchTogglesElement],\n });\n\n // The replace input and its action buttons are tagged as replace cells so\n // they can be hidden together when the panel is in find-only mode.\n const replaceInputBox = h('div', {\n dataset: { inputBox: '', replace: '', replaceCell: '' },\n children: [replaceInputElement],\n });\n\n const replaceActionsElement = h('div', {\n dataset: { replaceActions: '', replaceCell: '' },\n children: [\n iconButton({ icon: 'replace', label: 'Replace', onClick: replace }),\n iconButton({\n icon: 'replace-all',\n label: 'Replace All',\n onClick: replaceAll,\n }),\n ],\n });\n\n // Held so the no-results state can toggle their native disabled flag.\n const prevButton = iconButton({\n icon: 'arrow-up',\n label: 'Previous',\n onClick: () => {\n findNextMatch(true);\n },\n });\n const nextButton = iconButton({\n icon: 'arrow-down',\n label: 'Next',\n onClick: () => {\n findNextMatch();\n },\n });\n prevButton.disabled = true;\n nextButton.disabled = true;\n\n const navElement = h('div', {\n dataset: 'searchNav',\n children: [prevButton, nextButton],\n });\n\n const closeElement = iconButton({\n icon: 'close',\n label: 'Close',\n onClick: close,\n dataset: { searchClose: '' },\n });\n\n // Cells are positioned by CSS grid-template-areas (see editor.css), so DOM\n // order here only drives tab/reading order, not layout. Keep the replace\n // input directly after the find input (and its toggles) so Tab walks\n // find -> replace before reaching the nav arrows and close button.\n const gridElement = h('div', {\n dataset: { searchGrid: '', mode },\n children: [\n findInputBox,\n replaceInputBox,\n replaceActionsElement,\n matchResultElement,\n navElement,\n closeElement,\n ],\n });\n\n // Toggles the panel between find and find/replace modes by showing or\n // hiding the replace cells, then returns focus to the find input.\n const applyMode = (next: SearchPanelMode) => {\n gridElement.dataset.mode = next;\n this.#inputElement.focus();\n this.#inputElement.select();\n };\n this.#applyMode = applyMode;\n\n this.#container = h('div', {\n dataset: 'searchPanel',\n children: [\n h('div', {\n dataset: 'editorWidget',\n children: [gridElement],\n }),\n ],\n });\n\n matches.current = initialMatch;\n containerElement.before(this.#container);\n\n requestAnimationFrame(() => {\n if (initialMatch !== undefined) {\n updateMatches();\n } else {\n onUpdate([]);\n }\n this.#inputElement.select();\n });\n }\n\n focus(): void {\n this.#inputElement.focus();\n }\n\n navigate(findPrevious: boolean): void {\n this.#navigate?.(findPrevious);\n }\n\n updateMatches(options?: { syncSelection?: boolean }): void {\n this.#updateMatches?.(options);\n }\n\n setMode(mode: SearchPanelMode): void {\n this.#applyMode?.(mode);\n }\n\n cleanup(): void {\n this.#container.remove();\n }\n}\n"],"mappings":"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"}
|
|
@@ -28,17 +28,23 @@ declare function mapSelectionShift(textDocument: TextDocument<unknown>, selectio
|
|
|
28
28
|
/**
|
|
29
29
|
* Applies a text change to the given text document
|
|
30
30
|
*/
|
|
31
|
-
declare function applyTextChangeToSelections<LAnnotation>(textDocument: TextDocument<LAnnotation>, selections: EditorSelection[], edit: ResolvedTextEdit, lineAnnotations?: DiffLineAnnotation<LAnnotation>[], tabSize?: number): {
|
|
31
|
+
declare function applyTextChangeToSelections<LAnnotation>(textDocument: TextDocument<LAnnotation>, selections: EditorSelection[], edit: ResolvedTextEdit, lineAnnotations?: DiffLineAnnotation<LAnnotation>[], tabSize?: number, undoBoundary?: boolean): {
|
|
32
32
|
nextSelections: EditorSelection[];
|
|
33
33
|
change?: TextDocumentChange;
|
|
34
34
|
};
|
|
35
35
|
/**
|
|
36
36
|
* Applies a text replace to multiple selections.
|
|
37
37
|
*/
|
|
38
|
-
declare function applyTextReplaceToSelections<LAnnotation>(textDocument: TextDocument<LAnnotation>, selections: EditorSelection[], texts: string[], lineAnnotations?: DiffLineAnnotation<LAnnotation>[]): {
|
|
38
|
+
declare function applyTextReplaceToSelections<LAnnotation>(textDocument: TextDocument<LAnnotation>, selections: EditorSelection[], texts: string[], lineAnnotations?: DiffLineAnnotation<LAnnotation>[], undoBoundary?: boolean): {
|
|
39
39
|
nextSelections: EditorSelection[];
|
|
40
40
|
change?: TextDocumentChange;
|
|
41
41
|
};
|
|
42
|
+
type AutoSurround = 'default' | 'never' | 'brackets' | 'quotes' | 'languageDefined';
|
|
43
|
+
/**
|
|
44
|
+
* Returns per-selection replacement text when typing a surround character over
|
|
45
|
+
* non-collapsed selections, matching VS Code auto-surround behavior.
|
|
46
|
+
*/
|
|
47
|
+
declare function getAutoSurroundReplacementTexts<LAnnotation>(textDocument: TextDocument<LAnnotation>, selections: EditorSelection[], char: string, autoSurround?: AutoSurround): string[] | undefined;
|
|
42
48
|
/**
|
|
43
49
|
* Swaps the two characters adjacent to a collapsed selection, matching browser
|
|
44
50
|
* insertTranspose (Ctrl+T) behavior.
|
|
@@ -72,6 +78,18 @@ declare function applyDeleteWordBackwardToSelections<LAnnotation>(textDocument:
|
|
|
72
78
|
nextSelections: EditorSelection[];
|
|
73
79
|
change?: TextDocumentChange;
|
|
74
80
|
};
|
|
81
|
+
/**
|
|
82
|
+
* Resolves the document range deleted by Backspace or Delete at a collapsed
|
|
83
|
+
* caret. Non-collapsed selections delete their selected text instead.
|
|
84
|
+
*/
|
|
85
|
+
declare function resolveDeleteCharacterRange(textDocument: TextDocument<unknown>, selection: EditorSelection, forward: boolean): [start: Position, end: Position];
|
|
86
|
+
/**
|
|
87
|
+
* Deletes one grapheme (or selected text) at each selection.
|
|
88
|
+
*/
|
|
89
|
+
declare function applyDeleteCharacterToSelections<LAnnotation>(textDocument: TextDocument<LAnnotation>, selections: EditorSelection[], forward: boolean, lineAnnotations?: DiffLineAnnotation<LAnnotation>[], tabSize?: number): {
|
|
90
|
+
nextSelections: EditorSelection[];
|
|
91
|
+
change?: TextDocumentChange;
|
|
92
|
+
};
|
|
75
93
|
/**
|
|
76
94
|
* Checks if a selection is collapsed.
|
|
77
95
|
*/
|
|
@@ -96,6 +114,16 @@ declare function comparePosition(a: Position, b: Position): number;
|
|
|
96
114
|
* Creates a selection from anchor and focus offsets.
|
|
97
115
|
*/
|
|
98
116
|
declare function createSelectionFromAnchorAndFocusOffsets(textDocument: TextDocument<unknown>, anchorOffset: number, focusOffset: number): EditorSelection;
|
|
117
|
+
/**
|
|
118
|
+
* Re-anchors selections after a batch of text edits has been applied, so the
|
|
119
|
+
* caret keeps pointing at the same logical location in the changed buffer.
|
|
120
|
+
*
|
|
121
|
+
* `selectionOffsets` (one `[start, end]` pair per selection) and `edits` are
|
|
122
|
+
* measured in the PRE-edit document; the returned selections are built from
|
|
123
|
+
* `textDocument`, which must already reflect the applied edits. Selection
|
|
124
|
+
* direction is preserved by remapping each edge and re-deriving anchor/focus.
|
|
125
|
+
*/
|
|
126
|
+
declare function remapSelectionsAfterEdits(textDocument: TextDocument<unknown>, selections: readonly EditorSelection[], selectionOffsets: ReadonlyArray<readonly [number, number]>, edits: readonly ResolvedTextEdit[]): EditorSelection[];
|
|
99
127
|
/**
|
|
100
128
|
* Creates a selection from a anchor and focus selection.
|
|
101
129
|
*/
|
|
@@ -126,9 +154,18 @@ declare function getDocumentFullSelection(textDocument: TextDocument<unknown>):
|
|
|
126
154
|
*/
|
|
127
155
|
declare function getDocumentBoundarySelection(textDocument: TextDocument<unknown>, atEnd: boolean): EditorSelection;
|
|
128
156
|
/**
|
|
129
|
-
* Get the text of the selections for the given text document.
|
|
157
|
+
* Get the clipboard text of the selections for the given text document. Used by
|
|
158
|
+
* both copy and cut so the two stay in sync. Overlapping regions (e.g. several
|
|
159
|
+
* carets on one line) are merged so the same text is never emitted twice, and a
|
|
160
|
+
* line-ending separator is inserted only between regions that aren't already
|
|
161
|
+
* contiguous in the document.
|
|
130
162
|
*/
|
|
131
163
|
declare function getSelectionText(textDocument: TextDocument<unknown>, selections: EditorSelection[]): string;
|
|
164
|
+
declare function resolveSelectionCut(textDocument: TextDocument<unknown>, selections: EditorSelection[]): {
|
|
165
|
+
text: string;
|
|
166
|
+
edits: ResolvedTextEdit[];
|
|
167
|
+
nextSelectionOffsets: number[];
|
|
168
|
+
};
|
|
132
169
|
/**
|
|
133
170
|
* Get the anchor node and offset for a selection.
|
|
134
171
|
*/
|
|
@@ -138,5 +175,5 @@ declare function getSelectionAnchor(lineElement: HTMLElement, character: number)
|
|
|
138
175
|
*/
|
|
139
176
|
declare function expandCollapsedSelectionToWord(textDocument: TextDocument<unknown>, selection: EditorSelection): EditorSelection;
|
|
140
177
|
//#endregion
|
|
141
|
-
export { DirectionBackward, DirectionForward, DirectionNone, EditorSelection, SelectionDirection, applyDeleteHardLineForwardToSelections, applyDeleteSoftLineBackwardToSelections, applyDeleteWordBackwardToSelections, applyTextChangeToSelections, applyTextReplaceToSelections, applyTransposeToSelections, comparePosition, convertSelection, createSelectionFrom, createSelectionFromAnchorAndFocusOffsets, expandCollapsedSelectionToWord, extendSelection, extendSelections, findNexMatch, getCaretPosition, getDocumentBoundarySelection, getDocumentFullSelection, getSelectionAnchor, getSelectionText, isCollapsedSelection, isLineEditable, mapCursorMove, mapSelectionShift, mergeOverlappingSelections, resolveIndentEdits, selectionIntersects };
|
|
178
|
+
export { AutoSurround, DirectionBackward, DirectionForward, DirectionNone, EditorSelection, SelectionDirection, applyDeleteCharacterToSelections, applyDeleteHardLineForwardToSelections, applyDeleteSoftLineBackwardToSelections, applyDeleteWordBackwardToSelections, applyTextChangeToSelections, applyTextReplaceToSelections, applyTransposeToSelections, comparePosition, convertSelection, createSelectionFrom, createSelectionFromAnchorAndFocusOffsets, expandCollapsedSelectionToWord, extendSelection, extendSelections, findNexMatch, getAutoSurroundReplacementTexts, getCaretPosition, getDocumentBoundarySelection, getDocumentFullSelection, getSelectionAnchor, getSelectionText, isCollapsedSelection, isLineEditable, mapCursorMove, mapSelectionShift, mergeOverlappingSelections, remapSelectionsAfterEdits, resolveDeleteCharacterRange, resolveIndentEdits, resolveSelectionCut, selectionIntersects };
|
|
142
179
|
//# sourceMappingURL=selection.d.ts.map
|