@pierre/diffs 1.1.20 → 1.2.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/dist/components/CodeView.d.ts +324 -0
  2. package/dist/components/CodeView.d.ts.map +1 -0
  3. package/dist/components/CodeView.js +1245 -0
  4. package/dist/components/CodeView.js.map +1 -0
  5. package/dist/components/File.d.ts +13 -12
  6. package/dist/components/File.d.ts.map +1 -1
  7. package/dist/components/File.js +68 -28
  8. package/dist/components/File.js.map +1 -1
  9. package/dist/components/FileDiff.d.ts +9 -10
  10. package/dist/components/FileDiff.d.ts.map +1 -1
  11. package/dist/components/FileDiff.js +57 -30
  12. package/dist/components/FileDiff.js.map +1 -1
  13. package/dist/components/FileStream.js +9 -3
  14. package/dist/components/FileStream.js.map +1 -1
  15. package/dist/components/UnresolvedFile.d.ts.map +1 -1
  16. package/dist/components/VirtualizedFile.d.ts +28 -5
  17. package/dist/components/VirtualizedFile.d.ts.map +1 -1
  18. package/dist/components/VirtualizedFile.js +225 -45
  19. package/dist/components/VirtualizedFile.js.map +1 -1
  20. package/dist/components/VirtualizedFileDiff.d.ts +28 -5
  21. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  22. package/dist/components/VirtualizedFileDiff.js +285 -49
  23. package/dist/components/VirtualizedFileDiff.js.map +1 -1
  24. package/dist/components/Virtualizer.d.ts +6 -3
  25. package/dist/components/Virtualizer.d.ts.map +1 -1
  26. package/dist/components/Virtualizer.js +4 -6
  27. package/dist/components/Virtualizer.js.map +1 -1
  28. package/dist/components/VirtulizerDevelopment.d.ts +2 -2
  29. package/dist/components/VirtulizerDevelopment.d.ts.map +1 -1
  30. package/dist/constants.d.ts +6 -2
  31. package/dist/constants.d.ts.map +1 -1
  32. package/dist/constants.js +17 -2
  33. package/dist/constants.js.map +1 -1
  34. package/dist/index.d.ts +6 -5
  35. package/dist/index.js +11 -10
  36. package/dist/managers/InteractionManager.d.ts +11 -7
  37. package/dist/managers/InteractionManager.d.ts.map +1 -1
  38. package/dist/managers/InteractionManager.js +38 -25
  39. package/dist/managers/InteractionManager.js.map +1 -1
  40. package/dist/managers/ResizeManager.d.ts +4 -4
  41. package/dist/managers/ResizeManager.d.ts.map +1 -1
  42. package/dist/managers/ResizeManager.js +89 -54
  43. package/dist/managers/ResizeManager.js.map +1 -1
  44. package/dist/managers/UniversalRenderingManager.d.ts +2 -1
  45. package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
  46. package/dist/managers/UniversalRenderingManager.js +13 -16
  47. package/dist/managers/UniversalRenderingManager.js.map +1 -1
  48. package/dist/react/CodeView.d.ts +45 -0
  49. package/dist/react/CodeView.d.ts.map +1 -0
  50. package/dist/react/CodeView.js +241 -0
  51. package/dist/react/CodeView.js.map +1 -0
  52. package/dist/react/File.d.ts +0 -1
  53. package/dist/react/File.d.ts.map +1 -1
  54. package/dist/react/File.js +2 -3
  55. package/dist/react/File.js.map +1 -1
  56. package/dist/react/FileDiff.d.ts +0 -1
  57. package/dist/react/FileDiff.d.ts.map +1 -1
  58. package/dist/react/FileDiff.js +3 -4
  59. package/dist/react/FileDiff.js.map +1 -1
  60. package/dist/react/MultiFileDiff.d.ts +0 -1
  61. package/dist/react/MultiFileDiff.d.ts.map +1 -1
  62. package/dist/react/MultiFileDiff.js +3 -4
  63. package/dist/react/MultiFileDiff.js.map +1 -1
  64. package/dist/react/PatchDiff.d.ts +0 -1
  65. package/dist/react/PatchDiff.d.ts.map +1 -1
  66. package/dist/react/PatchDiff.js +3 -4
  67. package/dist/react/PatchDiff.js.map +1 -1
  68. package/dist/react/UnresolvedFile.d.ts +0 -1
  69. package/dist/react/UnresolvedFile.d.ts.map +1 -1
  70. package/dist/react/UnresolvedFile.js +3 -4
  71. package/dist/react/UnresolvedFile.js.map +1 -1
  72. package/dist/react/constants.d.ts.map +1 -1
  73. package/dist/react/index.d.ts +3 -2
  74. package/dist/react/index.js +5 -4
  75. package/dist/react/types.d.ts +0 -8
  76. package/dist/react/types.d.ts.map +1 -1
  77. package/dist/react/utils/renderDiffChildren.d.ts +0 -2
  78. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  79. package/dist/react/utils/renderDiffChildren.js +3 -4
  80. package/dist/react/utils/renderDiffChildren.js.map +1 -1
  81. package/dist/react/utils/renderFileChildren.d.ts +0 -2
  82. package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  83. package/dist/react/utils/renderFileChildren.js +3 -4
  84. package/dist/react/utils/renderFileChildren.js.map +1 -1
  85. package/dist/react/utils/useFileDiffInstance.js +12 -7
  86. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  87. package/dist/react/utils/useFileInstance.js +12 -7
  88. package/dist/react/utils/useFileInstance.js.map +1 -1
  89. package/dist/react/utils/useUnresolvedFileInstance.js +6 -2
  90. package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -1
  91. package/dist/renderers/DiffHunksRenderer.d.ts +2 -1
  92. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  93. package/dist/renderers/DiffHunksRenderer.js +35 -20
  94. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  95. package/dist/renderers/FileRenderer.d.ts +2 -1
  96. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  97. package/dist/renderers/FileRenderer.js +34 -20
  98. package/dist/renderers/FileRenderer.js.map +1 -1
  99. package/dist/ssr/index.d.ts +2 -2
  100. package/dist/ssr/preloadDiffs.js +1 -1
  101. package/dist/style.js +1 -1
  102. package/dist/style.js.map +1 -1
  103. package/dist/types.d.ts +98 -3
  104. package/dist/types.d.ts.map +1 -1
  105. package/dist/utils/areManagedSnapshotsEqual.d.ts +7 -0
  106. package/dist/utils/areManagedSnapshotsEqual.d.ts.map +1 -0
  107. package/dist/utils/areManagedSnapshotsEqual.js +15 -0
  108. package/dist/utils/areManagedSnapshotsEqual.js.map +1 -0
  109. package/dist/utils/areOptionsEqual.d.ts +2 -1
  110. package/dist/utils/areOptionsEqual.d.ts.map +1 -1
  111. package/dist/utils/areOptionsEqual.js +1 -1
  112. package/dist/utils/areOptionsEqual.js.map +1 -1
  113. package/dist/utils/createFileHeaderElement.d.ts +3 -1
  114. package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
  115. package/dist/utils/createFileHeaderElement.js +3 -2
  116. package/dist/utils/createFileHeaderElement.js.map +1 -1
  117. package/dist/utils/createWindowFromScrollPosition.d.ts +3 -3
  118. package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
  119. package/dist/utils/createWindowFromScrollPosition.js +6 -6
  120. package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
  121. package/dist/utils/iterateOverDiff.d.ts +2 -1
  122. package/dist/utils/iterateOverDiff.d.ts.map +1 -1
  123. package/dist/utils/iterateOverDiff.js +135 -7
  124. package/dist/utils/iterateOverDiff.js.map +1 -1
  125. package/dist/utils/renderFileWithHighlighter.js +1 -1
  126. package/dist/utils/resolveVirtualFileMetrics.d.ts +4 -1
  127. package/dist/utils/resolveVirtualFileMetrics.d.ts.map +1 -1
  128. package/dist/utils/resolveVirtualFileMetrics.js +11 -1
  129. package/dist/utils/resolveVirtualFileMetrics.js.map +1 -1
  130. package/dist/utils/roundToDevicePixel.d.ts +14 -0
  131. package/dist/utils/roundToDevicePixel.d.ts.map +1 -0
  132. package/dist/utils/roundToDevicePixel.js +18 -0
  133. package/dist/utils/roundToDevicePixel.js.map +1 -0
  134. package/dist/worker/worker-portable.js +195 -14
  135. package/dist/worker/worker-portable.js.map +1 -1
  136. package/dist/worker/worker.js +146 -7
  137. package/dist/worker/worker.js.map +1 -1
  138. package/package.json +7 -1
  139. package/dist/components/AdvancedVirtualizedFileDiff.d.ts +0 -40
  140. package/dist/components/AdvancedVirtualizedFileDiff.d.ts.map +0 -1
  141. package/dist/components/AdvancedVirtualizedFileDiff.js +0 -140
  142. package/dist/components/AdvancedVirtualizedFileDiff.js.map +0 -1
  143. package/dist/components/AdvancedVirtualizer.d.ts +0 -38
  144. package/dist/components/AdvancedVirtualizer.d.ts.map +0 -1
  145. package/dist/components/AdvancedVirtualizer.js +0 -201
  146. package/dist/components/AdvancedVirtualizer.js.map +0 -1
@@ -11,6 +11,17 @@ const DEFAULT_THEMES = {
11
11
  light: "pierre-light"
12
12
  };
13
13
  const DEFAULT_COLLAPSED_CONTEXT_THRESHOLD = 1;
14
+ const DEFAULT_VIRTUAL_FILE_METRICS = {
15
+ hunkLineCount: 50,
16
+ lineHeight: 20,
17
+ diffHeaderHeight: 44,
18
+ hunkSeparatorHeight: 32,
19
+ spacing: 8
20
+ };
21
+ const DEFAULT_CODE_VIEW_FILE_METRICS = {
22
+ ...DEFAULT_VIRTUAL_FILE_METRICS,
23
+ hunkLineCount: 1
24
+ };
14
25
  const DEFAULT_EXPANDED_REGION = Object.freeze({
15
26
  fromStart: 0,
16
27
  fromEnd: 0
@@ -680,13 +691,20 @@ function getLineNodes(nodes) {
680
691
  //#endregion
681
692
  //#region src/utils/iterateOverDiff.ts
682
693
  function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infinity, expandedHunks, collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, callback }) {
694
+ const iterationStart = getIterationStartState({
695
+ diff,
696
+ diffStyle,
697
+ startingLine,
698
+ expandedHunks,
699
+ collapsedContextThreshold
700
+ });
683
701
  const state = {
684
702
  finalHunk: diff.hunks.at(-1),
685
703
  viewportStart: startingLine,
686
704
  viewportEnd: startingLine + totalLines,
687
705
  isWindowedHighlight: startingLine > 0 || totalLines < Infinity,
688
- splitCount: 0,
689
- unifiedCount: 0,
706
+ splitCount: iterationStart.splitCount,
707
+ unifiedCount: iterationStart.unifiedCount,
690
708
  shouldBreak() {
691
709
  if (!state.isWindowedHighlight) return false;
692
710
  const breakUnified = state.unifiedCount >= startingLine + totalLines;
@@ -728,7 +746,9 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
728
746
  return callback(props) ?? false;
729
747
  }
730
748
  };
731
- hunkIterator: for (const [hunkIndex, hunk] of diff.hunks.entries()) {
749
+ hunkIterator: for (let hunkIndex = iterationStart.hunkIndex; hunkIndex < diff.hunks.length; hunkIndex++) {
750
+ const hunk = diff.hunks[hunkIndex];
751
+ if (hunk == null) throw new Error("iterateOverDiff: invalid hunk index");
732
752
  if (state.shouldBreak()) break;
733
753
  const leadingRegion = getExpandedRegion(diff.isPartial, hunk.collapsedBefore, expandedHunks, hunkIndex, collapsedContextThreshold);
734
754
  const trailingRegion = (() => {
@@ -758,8 +778,14 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
758
778
  let additionLineIndex$1 = hunk.additionLineIndex - leadingRegion.rangeSize;
759
779
  let deletionLineNumber$1 = hunk.deletionStart - leadingRegion.rangeSize;
760
780
  let additionLineNumber$1 = hunk.additionStart - leadingRegion.rangeSize;
761
- let index = 0;
781
+ const [startIndex, endIndex] = getEqualLineIterationRange(state, leadingRegion.fromStart, diffStyle);
782
+ if (startIndex > 0) state.incrementCounts(startIndex, startIndex);
783
+ let index = startIndex;
762
784
  while (index < leadingRegion.fromStart) {
785
+ if (index >= endIndex) {
786
+ state.incrementCounts(leadingRegion.fromStart - index, leadingRegion.fromStart - index);
787
+ break;
788
+ }
763
789
  if (state.isInWindow(0, 0)) {
764
790
  if (state.emit({
765
791
  hunkIndex,
@@ -791,8 +817,14 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
791
817
  additionLineIndex$1 = hunk.additionLineIndex - leadingRegion.fromEnd;
792
818
  deletionLineNumber$1 = hunk.deletionStart - leadingRegion.fromEnd;
793
819
  additionLineNumber$1 = hunk.additionStart - leadingRegion.fromEnd;
794
- index = 0;
820
+ const [fromEndStartIndex, fromEndEndIndex] = getEqualLineIterationRange(state, leadingRegion.fromEnd, diffStyle);
821
+ if (fromEndStartIndex > 0) state.incrementCounts(fromEndStartIndex, fromEndStartIndex);
822
+ index = fromEndStartIndex;
795
823
  while (index < leadingRegion.fromEnd) {
824
+ if (index >= fromEndEndIndex) {
825
+ state.incrementCounts(leadingRegion.fromEnd - index, leadingRegion.fromEnd - index);
826
+ break;
827
+ }
796
828
  if (state.isInWindow(0, 0)) {
797
829
  if (state.emit({
798
830
  hunkIndex,
@@ -834,8 +866,14 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
834
866
  const isLastContent = content === lastContent;
835
867
  if (content.type === "context") {
836
868
  if (!state.shouldSkip(content.lines, content.lines)) {
837
- let index = 0;
869
+ const [startIndex, endIndex] = getEqualLineIterationRange(state, content.lines, diffStyle);
870
+ if (startIndex > 0) state.incrementCounts(startIndex, startIndex);
871
+ let index = startIndex;
838
872
  while (index < content.lines) {
873
+ if (index >= endIndex) {
874
+ state.incrementCounts(content.lines - index, content.lines - index);
875
+ break;
876
+ }
839
877
  if (state.isInWindow(0, 0)) {
840
878
  const isLastLine = isLastContent && index === content.lines - 1;
841
879
  const unifiedRowIndex = unifiedLineIndex + index;
@@ -914,9 +952,15 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
914
952
  if (trailingRegion != null) {
915
953
  const { collapsedLines, fromStart, fromEnd } = trailingRegion;
916
954
  const len = fromStart + fromEnd;
917
- let index = 0;
955
+ const [startIndex, endIndex] = getEqualLineIterationRange(state, len, diffStyle);
956
+ if (startIndex > 0) state.incrementCounts(startIndex, startIndex);
957
+ let index = startIndex;
918
958
  while (index < len) {
919
959
  if (state.shouldBreak()) break hunkIterator;
960
+ if (index >= endIndex) {
961
+ state.incrementCounts(len - index, len - index);
962
+ break;
963
+ }
920
964
  if (state.isInWindow(0, 0)) {
921
965
  const isLastLine = index === len - 1;
922
966
  if (state.emit({
@@ -946,6 +990,101 @@ function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infin
946
990
  }
947
991
  }
948
992
  }
993
+ function getIterationStartState({ diff, diffStyle, startingLine, expandedHunks, collapsedContextThreshold }) {
994
+ if (startingLine <= 0 || diffStyle === "both") return {
995
+ hunkIndex: 0,
996
+ splitCount: 0,
997
+ unifiedCount: 0
998
+ };
999
+ const prefixCounts = getHunkPrefixCounts({
1000
+ diff,
1001
+ expandedHunks,
1002
+ collapsedContextThreshold
1003
+ });
1004
+ let low = 0;
1005
+ let high = diff.hunks.length - 1;
1006
+ let result = diff.hunks.length;
1007
+ while (low <= high) {
1008
+ const mid = low + high >> 1;
1009
+ const counts$1 = prefixCounts[mid + 1];
1010
+ if (counts$1 == null) throw new Error("iterateOverDiff: invalid hunk prefix index");
1011
+ if ((diffStyle === "unified" ? counts$1.unifiedCount : counts$1.splitCount) > startingLine) {
1012
+ result = mid;
1013
+ high = mid - 1;
1014
+ } else low = mid + 1;
1015
+ }
1016
+ if (result >= diff.hunks.length) {
1017
+ const counts$1 = prefixCounts[diff.hunks.length];
1018
+ if (counts$1 == null) throw new Error("iterateOverDiff: invalid terminal hunk prefix index");
1019
+ return {
1020
+ hunkIndex: diff.hunks.length,
1021
+ splitCount: counts$1.splitCount,
1022
+ unifiedCount: counts$1.unifiedCount
1023
+ };
1024
+ }
1025
+ const counts = prefixCounts[result];
1026
+ if (counts == null) throw new Error("iterateOverDiff: invalid selected hunk prefix index");
1027
+ return {
1028
+ hunkIndex: result,
1029
+ splitCount: counts.splitCount,
1030
+ unifiedCount: counts.unifiedCount
1031
+ };
1032
+ }
1033
+ function getHunkPrefixCounts({ diff, expandedHunks, collapsedContextThreshold }) {
1034
+ let splitCount = 0;
1035
+ let unifiedCount = 0;
1036
+ const finalHunkIndex = diff.hunks.length - 1;
1037
+ const prefixCounts = [{
1038
+ splitCount: 0,
1039
+ unifiedCount: 0
1040
+ }];
1041
+ for (let index = 0; index < diff.hunks.length; index++) {
1042
+ const hunk = diff.hunks[index];
1043
+ if (hunk == null) throw new Error("iterateOverDiff: invalid hunk summary index");
1044
+ const leadingRegion = getExpandedRegion(diff.isPartial, hunk.collapsedBefore, expandedHunks, index, collapsedContextThreshold);
1045
+ const leadingCount = leadingRegion.fromStart + leadingRegion.fromEnd;
1046
+ splitCount += leadingCount + hunk.splitLineCount;
1047
+ unifiedCount += leadingCount + hunk.unifiedLineCount;
1048
+ if (index === finalHunkIndex && hasFinalCollapsedHunk(diff)) {
1049
+ const trailingRangeSize = getTrailingRangeSize(diff, hunk);
1050
+ const trailingRegion = getExpandedRegion(diff.isPartial, trailingRangeSize, expandedHunks, diff.hunks.length, collapsedContextThreshold);
1051
+ const trailingCount = trailingRegion.fromStart + trailingRegion.fromEnd;
1052
+ splitCount += trailingCount;
1053
+ unifiedCount += trailingCount;
1054
+ }
1055
+ prefixCounts.push({
1056
+ splitCount,
1057
+ unifiedCount
1058
+ });
1059
+ }
1060
+ return prefixCounts;
1061
+ }
1062
+ function getEqualLineIterationRange(state, count, diffStyle) {
1063
+ if (!state.isWindowedHighlight || count <= 0) return [0, count];
1064
+ const ranges = [];
1065
+ function pushRange(currentCount) {
1066
+ const start$1 = Math.max(0, state.viewportStart - currentCount);
1067
+ const end$1 = Math.min(count, state.viewportEnd - currentCount);
1068
+ if (end$1 > start$1) ranges.push([start$1, end$1]);
1069
+ }
1070
+ if (diffStyle !== "split") pushRange(state.unifiedCount);
1071
+ if (diffStyle !== "unified") pushRange(state.splitCount);
1072
+ if (ranges.length === 0) return [0, 0];
1073
+ let start = ranges[0][0];
1074
+ let end = ranges[0][1];
1075
+ for (let index = 1; index < ranges.length; index++) {
1076
+ const range = ranges[index];
1077
+ start = Math.min(start, range[0]);
1078
+ end = Math.max(end, range[1]);
1079
+ }
1080
+ return [start, end];
1081
+ }
1082
+ function getTrailingRangeSize(diff, hunk) {
1083
+ const additionRemaining = diff.additionLines.length - (hunk.additionLineIndex + hunk.additionCount);
1084
+ const deletionRemaining = diff.deletionLines.length - (hunk.deletionLineIndex + hunk.deletionCount);
1085
+ if (additionRemaining !== deletionRemaining) throw new Error(`iterateOverDiff: trailing context mismatch (additions=${additionRemaining}, deletions=${deletionRemaining}) for ${diff.name}`);
1086
+ return Math.min(additionRemaining, deletionRemaining);
1087
+ }
949
1088
  function getExpandedRegion(isPartial, rangeSize, expandedHunks, hunkIndex, collapsedContextThreshold) {
950
1089
  rangeSize = Math.max(rangeSize, 0);
951
1090
  if (rangeSize === 0 || isPartial) return {