@theia/scm 1.64.0-next.28 → 1.64.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 (125) hide show
  1. package/lib/browser/decorations/scm-decorations-service.d.ts.map +1 -1
  2. package/lib/browser/decorations/scm-decorations-service.js +19 -1
  3. package/lib/browser/decorations/scm-decorations-service.js.map +1 -1
  4. package/lib/browser/merge-editor/merge-editor-contribution.d.ts +34 -0
  5. package/lib/browser/merge-editor/merge-editor-contribution.d.ts.map +1 -0
  6. package/lib/browser/merge-editor/merge-editor-contribution.js +335 -0
  7. package/lib/browser/merge-editor/merge-editor-contribution.js.map +1 -0
  8. package/lib/browser/merge-editor/merge-editor-dev-contribution.d.ts +31 -0
  9. package/lib/browser/merge-editor/merge-editor-dev-contribution.d.ts.map +1 -0
  10. package/lib/browser/merge-editor/merge-editor-dev-contribution.js +151 -0
  11. package/lib/browser/merge-editor/merge-editor-dev-contribution.js.map +1 -0
  12. package/lib/browser/merge-editor/merge-editor-module.d.ts +24 -0
  13. package/lib/browser/merge-editor/merge-editor-module.d.ts.map +1 -0
  14. package/lib/browser/merge-editor/merge-editor-module.js +109 -0
  15. package/lib/browser/merge-editor/merge-editor-module.js.map +1 -0
  16. package/lib/browser/merge-editor/merge-editor.d.ts +122 -0
  17. package/lib/browser/merge-editor/merge-editor.d.ts.map +1 -0
  18. package/lib/browser/merge-editor/merge-editor.js +560 -0
  19. package/lib/browser/merge-editor/merge-editor.js.map +1 -0
  20. package/lib/browser/merge-editor/model/line-range.d.ts +37 -0
  21. package/lib/browser/merge-editor/model/line-range.d.ts.map +1 -0
  22. package/lib/browser/merge-editor/model/line-range.js +111 -0
  23. package/lib/browser/merge-editor/model/line-range.js.map +1 -0
  24. package/lib/browser/merge-editor/model/live-diff.d.ts +26 -0
  25. package/lib/browser/merge-editor/model/live-diff.d.ts.map +1 -0
  26. package/lib/browser/merge-editor/model/live-diff.js +85 -0
  27. package/lib/browser/merge-editor/model/live-diff.js.map +1 -0
  28. package/lib/browser/merge-editor/model/merge-editor-model.d.ts +116 -0
  29. package/lib/browser/merge-editor/model/merge-editor-model.d.ts.map +1 -0
  30. package/lib/browser/merge-editor/model/merge-editor-model.js +507 -0
  31. package/lib/browser/merge-editor/model/merge-editor-model.js.map +1 -0
  32. package/lib/browser/merge-editor/model/merge-range.d.ts +50 -0
  33. package/lib/browser/merge-editor/model/merge-range.d.ts.map +1 -0
  34. package/lib/browser/merge-editor/model/merge-range.js +215 -0
  35. package/lib/browser/merge-editor/model/merge-range.js.map +1 -0
  36. package/lib/browser/merge-editor/model/range-editing.d.ts +21 -0
  37. package/lib/browser/merge-editor/model/range-editing.d.ts.map +1 -0
  38. package/lib/browser/merge-editor/model/range-editing.js +68 -0
  39. package/lib/browser/merge-editor/model/range-editing.js.map +1 -0
  40. package/lib/browser/merge-editor/model/range-mapping.d.ts +106 -0
  41. package/lib/browser/merge-editor/model/range-mapping.d.ts.map +1 -0
  42. package/lib/browser/merge-editor/model/range-mapping.js +252 -0
  43. package/lib/browser/merge-editor/model/range-mapping.js.map +1 -0
  44. package/lib/browser/merge-editor/model/range-mapping.spec.d.ts +2 -0
  45. package/lib/browser/merge-editor/model/range-mapping.spec.d.ts.map +1 -0
  46. package/lib/browser/merge-editor/model/range-mapping.spec.js +48 -0
  47. package/lib/browser/merge-editor/model/range-mapping.spec.js.map +1 -0
  48. package/lib/browser/merge-editor/model/range-utils.d.ts +25 -0
  49. package/lib/browser/merge-editor/model/range-utils.d.ts.map +1 -0
  50. package/lib/browser/merge-editor/model/range-utils.js +118 -0
  51. package/lib/browser/merge-editor/model/range-utils.js.map +1 -0
  52. package/lib/browser/merge-editor/view/diff-spacers.d.ts +50 -0
  53. package/lib/browser/merge-editor/view/diff-spacers.d.ts.map +1 -0
  54. package/lib/browser/merge-editor/view/diff-spacers.js +133 -0
  55. package/lib/browser/merge-editor/view/diff-spacers.js.map +1 -0
  56. package/lib/browser/merge-editor/view/merge-editor-panes/index.d.ts +6 -0
  57. package/lib/browser/merge-editor/view/merge-editor-panes/index.d.ts.map +1 -0
  58. package/lib/browser/merge-editor/view/merge-editor-panes/index.js +24 -0
  59. package/lib/browser/merge-editor/view/merge-editor-panes/index.js.map +1 -0
  60. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-base-pane.d.ts +12 -0
  61. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-base-pane.d.ts.map +1 -0
  62. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-base-pane.js +65 -0
  63. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-base-pane.js.map +1 -0
  64. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-pane-header.d.ts +30 -0
  65. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-pane-header.d.ts.map +1 -0
  66. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-pane-header.js +102 -0
  67. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-pane-header.js.map +1 -0
  68. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-pane.d.ts +49 -0
  69. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-pane.d.ts.map +1 -0
  70. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-pane.js +214 -0
  71. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-pane.js.map +1 -0
  72. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-result-pane.d.ts +16 -0
  73. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-result-pane.d.ts.map +1 -0
  74. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-result-pane.js +107 -0
  75. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-result-pane.js.map +1 -0
  76. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-side-pane.d.ts +27 -0
  77. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-side-pane.d.ts.map +1 -0
  78. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-side-pane.js +135 -0
  79. package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-side-pane.js.map +1 -0
  80. package/lib/browser/merge-editor/view/merge-editor-scroll-sync.d.ts +20 -0
  81. package/lib/browser/merge-editor/view/merge-editor-scroll-sync.d.ts.map +1 -0
  82. package/lib/browser/merge-editor/view/merge-editor-scroll-sync.js +218 -0
  83. package/lib/browser/merge-editor/view/merge-editor-scroll-sync.js.map +1 -0
  84. package/lib/browser/merge-editor/view/merge-editor-view-zones.d.ts +57 -0
  85. package/lib/browser/merge-editor/view/merge-editor-view-zones.d.ts.map +1 -0
  86. package/lib/browser/merge-editor/view/merge-editor-view-zones.js +218 -0
  87. package/lib/browser/merge-editor/view/merge-editor-view-zones.js.map +1 -0
  88. package/lib/browser/merge-editor/view/merge-range-actions.d.ts +23 -0
  89. package/lib/browser/merge-editor/view/merge-range-actions.d.ts.map +1 -0
  90. package/lib/browser/merge-editor/view/merge-range-actions.js +142 -0
  91. package/lib/browser/merge-editor/view/merge-range-actions.js.map +1 -0
  92. package/lib/browser/scm-colors.d.ts +2 -0
  93. package/lib/browser/scm-colors.d.ts.map +1 -1
  94. package/lib/browser/scm-colors.js +2 -0
  95. package/lib/browser/scm-colors.js.map +1 -1
  96. package/lib/browser/scm-frontend-module.d.ts.map +1 -1
  97. package/lib/browser/scm-frontend-module.js +2 -0
  98. package/lib/browser/scm-frontend-module.js.map +1 -1
  99. package/package.json +7 -7
  100. package/src/browser/decorations/scm-decorations-service.ts +18 -1
  101. package/src/browser/merge-editor/merge-editor-contribution.ts +346 -0
  102. package/src/browser/merge-editor/merge-editor-dev-contribution.ts +154 -0
  103. package/src/browser/merge-editor/merge-editor-module.ts +134 -0
  104. package/src/browser/merge-editor/merge-editor.ts +643 -0
  105. package/src/browser/merge-editor/model/line-range.ts +128 -0
  106. package/src/browser/merge-editor/model/live-diff.ts +111 -0
  107. package/src/browser/merge-editor/model/merge-editor-model.ts +623 -0
  108. package/src/browser/merge-editor/model/merge-range.ts +268 -0
  109. package/src/browser/merge-editor/model/range-editing.ts +81 -0
  110. package/src/browser/merge-editor/model/range-mapping.spec.ts +52 -0
  111. package/src/browser/merge-editor/model/range-mapping.ts +396 -0
  112. package/src/browser/merge-editor/model/range-utils.ts +115 -0
  113. package/src/browser/merge-editor/view/diff-spacers.ts +160 -0
  114. package/src/browser/merge-editor/view/merge-editor-panes/index.ts +21 -0
  115. package/src/browser/merge-editor/view/merge-editor-panes/merge-editor-base-pane.ts +71 -0
  116. package/src/browser/merge-editor/view/merge-editor-panes/merge-editor-pane-header.tsx +106 -0
  117. package/src/browser/merge-editor/view/merge-editor-panes/merge-editor-pane.ts +246 -0
  118. package/src/browser/merge-editor/view/merge-editor-panes/merge-editor-result-pane.ts +115 -0
  119. package/src/browser/merge-editor/view/merge-editor-panes/merge-editor-side-pane.ts +139 -0
  120. package/src/browser/merge-editor/view/merge-editor-scroll-sync.ts +241 -0
  121. package/src/browser/merge-editor/view/merge-editor-view-zones.ts +264 -0
  122. package/src/browser/merge-editor/view/merge-range-actions.ts +159 -0
  123. package/src/browser/scm-colors.ts +2 -0
  124. package/src/browser/scm-frontend-module.ts +4 -0
  125. package/src/browser/style/merge-editor.css +221 -0
@@ -0,0 +1,128 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2025 1C-Soft LLC and others.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+ /*---------------------------------------------------------------------------------------------
17
+ * Copyright (c) Microsoft Corporation. All rights reserved.
18
+ * Licensed under the MIT License. See License.txt in the project root for license information.
19
+ *--------------------------------------------------------------------------------------------*/
20
+ // copied and modified from https://github.com/microsoft/vscode/blob/1.96.3/src/vs/workbench/contrib/mergeEditor/browser/model/lineRange.ts
21
+
22
+ import { Range, uinteger } from '@theia/core/shared/vscode-languageserver-protocol';
23
+ import { TextEditorDocument } from '@theia/editor/lib/browser/editor';
24
+
25
+ /**
26
+ * Represents a range of whole lines of text. Line numbers are zero-based.
27
+ */
28
+ export class LineRange {
29
+ static compareByStart(a: LineRange, b: LineRange): number {
30
+ return a.startLineNumber - b.startLineNumber;
31
+ }
32
+
33
+ static fromLineNumbers(startLineNumber: number, endExclusiveLineNumber: number): LineRange {
34
+ return new LineRange(startLineNumber, endExclusiveLineNumber - startLineNumber);
35
+ }
36
+
37
+ constructor(
38
+ /** A zero-based number of the start line. The range starts exactly at the beginning of this line. */
39
+ readonly startLineNumber: number,
40
+ readonly lineCount: number
41
+ ) {
42
+ if (startLineNumber < 0 || lineCount < 0) {
43
+ throw new Error('Invalid line range: ' + this.toString());
44
+ }
45
+ }
46
+
47
+ join(other: LineRange): LineRange {
48
+ return LineRange.fromLineNumbers(Math.min(this.startLineNumber, other.startLineNumber), Math.max(this.endLineNumberExclusive, other.endLineNumberExclusive));
49
+ }
50
+
51
+ /** A zero-based number of the end line. The range ends just before the beginning of this line. */
52
+ get endLineNumberExclusive(): number {
53
+ return this.startLineNumber + this.lineCount;
54
+ }
55
+
56
+ get isEmpty(): boolean {
57
+ return this.lineCount === 0;
58
+ }
59
+
60
+ /**
61
+ * Returns `false` if there is at least one line between `this` and `other`.
62
+ */
63
+ touches(other: LineRange): boolean {
64
+ return this.startLineNumber <= other.endLineNumberExclusive && other.startLineNumber <= this.endLineNumberExclusive;
65
+ }
66
+
67
+ isAfter(other: LineRange): boolean {
68
+ return this.startLineNumber >= other.endLineNumberExclusive;
69
+ }
70
+
71
+ isBefore(other: LineRange): boolean {
72
+ return other.startLineNumber >= this.endLineNumberExclusive;
73
+ }
74
+
75
+ delta(lineDelta: number): LineRange {
76
+ return new LineRange(this.startLineNumber + lineDelta, this.lineCount);
77
+ }
78
+
79
+ deltaStart(lineDelta: number): LineRange {
80
+ return new LineRange(this.startLineNumber + lineDelta, this.lineCount - lineDelta);
81
+ }
82
+
83
+ deltaEnd(lineDelta: number): LineRange {
84
+ return new LineRange(this.startLineNumber, this.lineCount + lineDelta);
85
+ }
86
+
87
+ toString(): string {
88
+ return `[${this.startLineNumber},${this.endLineNumberExclusive})`;
89
+ }
90
+
91
+ equals(other: LineRange): boolean {
92
+ return this.startLineNumber === other.startLineNumber && this.lineCount === other.lineCount;
93
+ }
94
+
95
+ contains(other: LineRange): boolean {
96
+ return this.startLineNumber <= other.startLineNumber && other.endLineNumberExclusive <= this.endLineNumberExclusive;
97
+ }
98
+
99
+ containsLine(lineNumber: number): boolean {
100
+ return this.startLineNumber <= lineNumber && lineNumber < this.endLineNumberExclusive;
101
+ }
102
+
103
+ getLines(document: TextEditorDocument): string[] {
104
+ const result = new Array(this.lineCount);
105
+ for (let i = 0; i < this.lineCount; i++) {
106
+ result[i] = document.getLineContent(this.startLineNumber + i + 1); // note that getLineContent expects a one-based line number
107
+ }
108
+ return result;
109
+ }
110
+
111
+ toRange(): Range {
112
+ return Range.create(this.startLineNumber, 0, this.endLineNumberExclusive, 0);
113
+ }
114
+
115
+ toInclusiveRange(): Range | undefined {
116
+ if (this.isEmpty) {
117
+ return undefined;
118
+ }
119
+ return Range.create(this.startLineNumber, 0, this.endLineNumberExclusive - 1, uinteger.MAX_VALUE);
120
+ }
121
+
122
+ toInclusiveRangeOrEmpty(): Range {
123
+ if (this.isEmpty) {
124
+ return Range.create(this.startLineNumber, 0, this.startLineNumber, 0);
125
+ }
126
+ return Range.create(this.startLineNumber, 0, this.endLineNumberExclusive - 1, uinteger.MAX_VALUE);
127
+ }
128
+ }
@@ -0,0 +1,111 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2025 1C-Soft LLC and others.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+ /*---------------------------------------------------------------------------------------------
17
+ * Copyright (c) Microsoft Corporation. All rights reserved.
18
+ * Licensed under the MIT License. See License.txt in the project root for license information.
19
+ *--------------------------------------------------------------------------------------------*/
20
+ // copied and modified from https://github.com/microsoft/vscode/blob/1.96.3/src/vs/workbench/contrib/mergeEditor/browser/model/textModelDiffs.ts
21
+
22
+ import { Disposable, DisposableCollection, URI } from '@theia/core';
23
+ import { Autorun, Observable, ObservableSignal, SettableObservable } from '@theia/core/lib/common/observable';
24
+ import { DiffComputer, LineRange as DiffLineRange } from '@theia/core/lib/common/diff';
25
+ import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model';
26
+ import { DetailedLineRangeMapping, RangeMapping } from './range-mapping';
27
+ import { LineRange } from './line-range';
28
+
29
+ export class LiveDiff implements Disposable {
30
+
31
+ protected recomputeCount = 0;
32
+ protected readonly stateObservable = SettableObservable.create(LiveDiffState.Initializing);
33
+ protected readonly changesObservable = SettableObservable.create<readonly DetailedLineRangeMapping[]>([]);
34
+ protected readonly toDispose = new DisposableCollection();
35
+
36
+ constructor(
37
+ protected readonly originalDocument: MonacoEditorModel,
38
+ protected readonly modifiedDocument: MonacoEditorModel,
39
+ protected readonly diffComputer: DiffComputer
40
+ ) {
41
+ const recomputeSignal = ObservableSignal.create();
42
+
43
+ this.toDispose.push(Autorun.create(() => {
44
+ recomputeSignal.get();
45
+ this.recompute();
46
+ }));
47
+
48
+ this.toDispose.push(originalDocument.onDidChangeContent(
49
+ () => recomputeSignal.trigger()
50
+ ));
51
+ this.toDispose.push(modifiedDocument.onDidChangeContent(
52
+ () => recomputeSignal.trigger()
53
+ ));
54
+ }
55
+
56
+ dispose(): void {
57
+ this.toDispose.dispose();
58
+ }
59
+
60
+ get state(): LiveDiffState {
61
+ return this.stateObservable.get();
62
+ }
63
+
64
+ get changes(): readonly DetailedLineRangeMapping[] {
65
+ return this.changesObservable.get();
66
+ }
67
+
68
+ protected recompute(): void {
69
+ const recomputeCount = ++this.recomputeCount;
70
+
71
+ if (this.stateObservable.getUntracked() !== LiveDiffState.Initializing) { // untracked to avoid an infinite change loop in the autorun
72
+ this.stateObservable.set(LiveDiffState.Updating);
73
+ }
74
+
75
+ this.diffComputer.computeDiff(new URI(this.originalDocument.uri), new URI(this.modifiedDocument.uri)).then(diff => {
76
+ if (this.toDispose.disposed || this.originalDocument.isDisposed() || this.modifiedDocument.isDisposed()) {
77
+ return;
78
+ }
79
+
80
+ if (recomputeCount !== this.recomputeCount) {
81
+ // There is a newer recompute call
82
+ return;
83
+ }
84
+
85
+ const toLineRange = (r: DiffLineRange) => new LineRange(r.start, r.end - r.start);
86
+ const changes = diff?.changes.map(change => new DetailedLineRangeMapping(
87
+ toLineRange(change.left),
88
+ this.originalDocument,
89
+ toLineRange(change.right),
90
+ this.modifiedDocument,
91
+ change.innerChanges?.map(innerChange => new RangeMapping(innerChange.left, innerChange.right))
92
+ ));
93
+
94
+ Observable.update(() => {
95
+ if (changes) {
96
+ this.stateObservable.set(LiveDiffState.UpToDate);
97
+ this.changesObservable.set(changes);
98
+ } else {
99
+ this.stateObservable.set(LiveDiffState.Error);
100
+ }
101
+ });
102
+ });
103
+ }
104
+ }
105
+
106
+ export const enum LiveDiffState {
107
+ Initializing,
108
+ UpToDate,
109
+ Updating,
110
+ Error
111
+ }