@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.
- package/dist/components/CodeView.d.ts +324 -0
- package/dist/components/CodeView.d.ts.map +1 -0
- package/dist/components/CodeView.js +1245 -0
- package/dist/components/CodeView.js.map +1 -0
- package/dist/components/File.d.ts +13 -12
- package/dist/components/File.d.ts.map +1 -1
- package/dist/components/File.js +68 -28
- package/dist/components/File.js.map +1 -1
- package/dist/components/FileDiff.d.ts +9 -10
- package/dist/components/FileDiff.d.ts.map +1 -1
- package/dist/components/FileDiff.js +57 -30
- package/dist/components/FileDiff.js.map +1 -1
- package/dist/components/FileStream.js +9 -3
- package/dist/components/FileStream.js.map +1 -1
- package/dist/components/UnresolvedFile.d.ts.map +1 -1
- package/dist/components/VirtualizedFile.d.ts +28 -5
- package/dist/components/VirtualizedFile.d.ts.map +1 -1
- package/dist/components/VirtualizedFile.js +225 -45
- package/dist/components/VirtualizedFile.js.map +1 -1
- package/dist/components/VirtualizedFileDiff.d.ts +28 -5
- package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
- package/dist/components/VirtualizedFileDiff.js +285 -49
- package/dist/components/VirtualizedFileDiff.js.map +1 -1
- package/dist/components/Virtualizer.d.ts +6 -3
- package/dist/components/Virtualizer.d.ts.map +1 -1
- package/dist/components/Virtualizer.js +4 -6
- package/dist/components/Virtualizer.js.map +1 -1
- package/dist/components/VirtulizerDevelopment.d.ts +2 -2
- package/dist/components/VirtulizerDevelopment.d.ts.map +1 -1
- package/dist/constants.d.ts +6 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +17 -2
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.js +11 -10
- package/dist/managers/InteractionManager.d.ts +11 -7
- package/dist/managers/InteractionManager.d.ts.map +1 -1
- package/dist/managers/InteractionManager.js +38 -25
- package/dist/managers/InteractionManager.js.map +1 -1
- package/dist/managers/ResizeManager.d.ts +4 -4
- package/dist/managers/ResizeManager.d.ts.map +1 -1
- package/dist/managers/ResizeManager.js +89 -54
- package/dist/managers/ResizeManager.js.map +1 -1
- package/dist/managers/UniversalRenderingManager.d.ts +2 -1
- package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
- package/dist/managers/UniversalRenderingManager.js +13 -16
- package/dist/managers/UniversalRenderingManager.js.map +1 -1
- package/dist/react/CodeView.d.ts +45 -0
- package/dist/react/CodeView.d.ts.map +1 -0
- package/dist/react/CodeView.js +241 -0
- package/dist/react/CodeView.js.map +1 -0
- package/dist/react/File.d.ts +0 -1
- package/dist/react/File.d.ts.map +1 -1
- package/dist/react/File.js +2 -3
- package/dist/react/File.js.map +1 -1
- package/dist/react/FileDiff.d.ts +0 -1
- package/dist/react/FileDiff.d.ts.map +1 -1
- package/dist/react/FileDiff.js +3 -4
- package/dist/react/FileDiff.js.map +1 -1
- package/dist/react/MultiFileDiff.d.ts +0 -1
- package/dist/react/MultiFileDiff.d.ts.map +1 -1
- package/dist/react/MultiFileDiff.js +3 -4
- package/dist/react/MultiFileDiff.js.map +1 -1
- package/dist/react/PatchDiff.d.ts +0 -1
- package/dist/react/PatchDiff.d.ts.map +1 -1
- package/dist/react/PatchDiff.js +3 -4
- package/dist/react/PatchDiff.js.map +1 -1
- package/dist/react/UnresolvedFile.d.ts +0 -1
- package/dist/react/UnresolvedFile.d.ts.map +1 -1
- package/dist/react/UnresolvedFile.js +3 -4
- package/dist/react/UnresolvedFile.js.map +1 -1
- package/dist/react/constants.d.ts.map +1 -1
- package/dist/react/index.d.ts +3 -2
- package/dist/react/index.js +5 -4
- package/dist/react/types.d.ts +0 -8
- package/dist/react/types.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.d.ts +0 -2
- package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.js +3 -4
- package/dist/react/utils/renderDiffChildren.js.map +1 -1
- package/dist/react/utils/renderFileChildren.d.ts +0 -2
- package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
- package/dist/react/utils/renderFileChildren.js +3 -4
- package/dist/react/utils/renderFileChildren.js.map +1 -1
- package/dist/react/utils/useFileDiffInstance.js +12 -7
- package/dist/react/utils/useFileDiffInstance.js.map +1 -1
- package/dist/react/utils/useFileInstance.js +12 -7
- package/dist/react/utils/useFileInstance.js.map +1 -1
- package/dist/react/utils/useUnresolvedFileInstance.js +6 -2
- package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -1
- package/dist/renderers/DiffHunksRenderer.d.ts +2 -1
- package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/DiffHunksRenderer.js +35 -20
- package/dist/renderers/DiffHunksRenderer.js.map +1 -1
- package/dist/renderers/FileRenderer.d.ts +2 -1
- package/dist/renderers/FileRenderer.d.ts.map +1 -1
- package/dist/renderers/FileRenderer.js +34 -20
- package/dist/renderers/FileRenderer.js.map +1 -1
- package/dist/ssr/index.d.ts +2 -2
- package/dist/ssr/preloadDiffs.js +1 -1
- package/dist/style.js +1 -1
- package/dist/style.js.map +1 -1
- package/dist/types.d.ts +98 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/areManagedSnapshotsEqual.d.ts +7 -0
- package/dist/utils/areManagedSnapshotsEqual.d.ts.map +1 -0
- package/dist/utils/areManagedSnapshotsEqual.js +15 -0
- package/dist/utils/areManagedSnapshotsEqual.js.map +1 -0
- package/dist/utils/areOptionsEqual.d.ts +2 -1
- package/dist/utils/areOptionsEqual.d.ts.map +1 -1
- package/dist/utils/areOptionsEqual.js +1 -1
- package/dist/utils/areOptionsEqual.js.map +1 -1
- package/dist/utils/createFileHeaderElement.d.ts +3 -1
- package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
- package/dist/utils/createFileHeaderElement.js +3 -2
- package/dist/utils/createFileHeaderElement.js.map +1 -1
- package/dist/utils/createWindowFromScrollPosition.d.ts +3 -3
- package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
- package/dist/utils/createWindowFromScrollPosition.js +6 -6
- package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
- package/dist/utils/iterateOverDiff.d.ts +2 -1
- package/dist/utils/iterateOverDiff.d.ts.map +1 -1
- package/dist/utils/iterateOverDiff.js +135 -7
- package/dist/utils/iterateOverDiff.js.map +1 -1
- package/dist/utils/renderFileWithHighlighter.js +1 -1
- package/dist/utils/resolveVirtualFileMetrics.d.ts +4 -1
- package/dist/utils/resolveVirtualFileMetrics.d.ts.map +1 -1
- package/dist/utils/resolveVirtualFileMetrics.js +11 -1
- package/dist/utils/resolveVirtualFileMetrics.js.map +1 -1
- package/dist/utils/roundToDevicePixel.d.ts +14 -0
- package/dist/utils/roundToDevicePixel.d.ts.map +1 -0
- package/dist/utils/roundToDevicePixel.js +18 -0
- package/dist/utils/roundToDevicePixel.js.map +1 -0
- package/dist/worker/worker-portable.js +195 -14
- package/dist/worker/worker-portable.js.map +1 -1
- package/dist/worker/worker.js +146 -7
- package/dist/worker/worker.js.map +1 -1
- package/package.json +7 -1
- package/dist/components/AdvancedVirtualizedFileDiff.d.ts +0 -40
- package/dist/components/AdvancedVirtualizedFileDiff.d.ts.map +0 -1
- package/dist/components/AdvancedVirtualizedFileDiff.js +0 -140
- package/dist/components/AdvancedVirtualizedFileDiff.js.map +0 -1
- package/dist/components/AdvancedVirtualizer.d.ts +0 -38
- package/dist/components/AdvancedVirtualizer.d.ts.map +0 -1
- package/dist/components/AdvancedVirtualizer.js +0 -201
- package/dist/components/AdvancedVirtualizer.js.map +0 -1
package/dist/worker/worker.js
CHANGED
|
@@ -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:
|
|
689
|
-
unifiedCount:
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|