@theia/scm 1.77.0-next.49 → 1.77.0-next.57
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/lib/browser/decorations/scm-navigator-decorator.js +1 -1
- package/lib/browser/decorations/scm-navigator-decorator.js.map +1 -1
- package/lib/browser/dirty-diff/content-lines.spec.js +2 -1
- package/lib/browser/dirty-diff/content-lines.spec.js.map +1 -1
- package/lib/browser/dirty-diff/diff-computer.js +2 -1
- package/lib/browser/dirty-diff/diff-computer.js.map +1 -1
- package/lib/browser/dirty-diff/diff-computer.spec.js +2 -1
- package/lib/browser/dirty-diff/diff-computer.spec.js.map +1 -1
- package/lib/browser/dirty-diff/dirty-diff-navigator.js.map +1 -1
- package/lib/browser/dirty-diff/dirty-diff-widget.js +1 -1
- package/lib/browser/dirty-diff/dirty-diff-widget.js.map +1 -1
- package/lib/browser/merge-editor/merge-editor-contribution.d.ts +1 -1
- package/lib/browser/merge-editor/merge-editor-contribution.d.ts.map +1 -1
- package/lib/browser/merge-editor/merge-editor-dev-contribution.d.ts +1 -1
- package/lib/browser/merge-editor/merge-editor-dev-contribution.d.ts.map +1 -1
- package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-pane-header.js +1 -1
- package/lib/browser/merge-editor/view/merge-editor-panes/merge-editor-pane-header.js.map +1 -1
- package/lib/browser/merge-editor/view/merge-editor-view-zones.js +1 -1
- package/lib/browser/merge-editor/view/merge-editor-view-zones.js.map +1 -1
- package/lib/browser/multi-diff-editor/multi-diff-editor-module.d.ts +4 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor-module.d.ts.map +1 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor-module.js +34 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor-module.js.map +1 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor-uri.d.ts +15 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor-uri.d.ts.map +1 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor-uri.js +68 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor-uri.js.map +1 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor-widget-factory.d.ts +18 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor-widget-factory.d.ts.map +1 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor-widget-factory.js +76 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor-widget-factory.js.map +1 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor-widget.spec.d.ts +2 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor-widget.spec.d.ts.map +1 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor-widget.spec.js +835 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor-widget.spec.js.map +1 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor.d.ts +163 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor.d.ts.map +1 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor.js +563 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor.js.map +1 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor.spec.d.ts +2 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor.spec.d.ts.map +1 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor.spec.js +167 -0
- package/lib/browser/multi-diff-editor/multi-diff-editor.spec.js.map +1 -0
- package/lib/browser/scm-action-button-widget.js +1 -1
- package/lib/browser/scm-action-button-widget.js.map +1 -1
- package/lib/browser/scm-amend-component.js +2 -1
- package/lib/browser/scm-amend-component.js.map +1 -1
- package/lib/browser/scm-amend-widget.js +1 -1
- package/lib/browser/scm-amend-widget.js.map +1 -1
- package/lib/browser/scm-commit-widget.js +2 -2
- package/lib/browser/scm-commit-widget.js.map +1 -1
- package/lib/browser/scm-contribution.js +1 -1
- package/lib/browser/scm-contribution.js.map +1 -1
- package/lib/browser/scm-frontend-module.d.ts.map +1 -1
- package/lib/browser/scm-frontend-module.js +2 -0
- package/lib/browser/scm-frontend-module.js.map +1 -1
- package/lib/browser/scm-history-graph-widget.js +2 -2
- package/lib/browser/scm-history-graph-widget.js.map +1 -1
- package/lib/browser/scm-history-graph-widget.spec.js +2 -1
- package/lib/browser/scm-history-graph-widget.spec.js.map +1 -1
- package/lib/browser/scm-input.js +3 -2
- package/lib/browser/scm-input.js.map +1 -1
- package/lib/browser/scm-provider.d.ts +2 -0
- package/lib/browser/scm-provider.d.ts.map +1 -1
- package/lib/browser/scm-quick-open-service.js +1 -1
- package/lib/browser/scm-quick-open-service.js.map +1 -1
- package/lib/browser/scm-repositories-widget.js +2 -2
- package/lib/browser/scm-repositories-widget.js.map +1 -1
- package/lib/browser/scm-repositories-widget.spec.js +2 -1
- package/lib/browser/scm-repositories-widget.spec.js.map +1 -1
- package/lib/browser/scm-service.js +1 -1
- package/lib/browser/scm-service.js.map +1 -1
- package/lib/browser/scm-tree-label-provider.js +1 -1
- package/lib/browser/scm-tree-label-provider.js.map +1 -1
- package/lib/browser/scm-tree-model.js +1 -1
- package/lib/browser/scm-tree-model.js.map +1 -1
- package/lib/browser/scm-tree-widget.js +2 -2
- package/lib/browser/scm-tree-widget.js.map +1 -1
- package/package.json +6 -6
- package/src/browser/dirty-diff/dirty-diff-navigator.ts +1 -1
- package/src/browser/multi-diff-editor/multi-diff-editor-module.ts +35 -0
- package/src/browser/multi-diff-editor/multi-diff-editor-uri.ts +83 -0
- package/src/browser/multi-diff-editor/multi-diff-editor-widget-factory.ts +81 -0
- package/src/browser/multi-diff-editor/multi-diff-editor-widget.spec.ts +878 -0
- package/src/browser/multi-diff-editor/multi-diff-editor.spec.ts +189 -0
- package/src/browser/multi-diff-editor/multi-diff-editor.ts +628 -0
- package/src/browser/scm-frontend-module.ts +3 -0
- package/src/browser/scm-input.ts +1 -1
- package/src/browser/scm-provider.ts +2 -0
- package/src/browser/style/multi-diff-editor.css +113 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2026 EclipseSource 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
|
+
import { expect } from 'chai';
|
|
18
|
+
import { URI } from '@theia/core';
|
|
19
|
+
import { MultiDiffEditorUri, MultiDiffEditorUriData } from './multi-diff-editor-uri';
|
|
20
|
+
|
|
21
|
+
describe('MultiDiffEditorUri', () => {
|
|
22
|
+
|
|
23
|
+
const sampleData: MultiDiffEditorUriData = {
|
|
24
|
+
title: 'Test Changes',
|
|
25
|
+
resources: [
|
|
26
|
+
{
|
|
27
|
+
originalUri: new URI('file:///path/to/original/file1.ts'),
|
|
28
|
+
modifiedUri: new URI('file:///path/to/modified/file1.ts')
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
originalUri: new URI('file:///path/to/original/file2.ts'),
|
|
32
|
+
modifiedUri: new URI('file:///path/to/modified/file2.ts')
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
describe('encode', () => {
|
|
38
|
+
|
|
39
|
+
it('should create a URI with the multi-diff-editor scheme', () => {
|
|
40
|
+
const uri = MultiDiffEditorUri.encode(sampleData);
|
|
41
|
+
expect(uri.scheme).to.equal('multi-diff-editor');
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('should encode resources in the query', () => {
|
|
45
|
+
const uri = MultiDiffEditorUri.encode(sampleData);
|
|
46
|
+
const parsed = JSON.parse(uri.query);
|
|
47
|
+
expect(parsed.title).to.equal('Test Changes');
|
|
48
|
+
expect(parsed.resources).to.have.length(2);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('should be deterministic for the same data', () => {
|
|
52
|
+
const uri1 = MultiDiffEditorUri.encode(sampleData);
|
|
53
|
+
const uri2 = MultiDiffEditorUri.encode(sampleData);
|
|
54
|
+
expect(uri1.toString()).to.equal(uri2.toString());
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('should produce different URIs for different data', () => {
|
|
58
|
+
const uri1 = MultiDiffEditorUri.encode(sampleData);
|
|
59
|
+
const uri2 = MultiDiffEditorUri.encode({
|
|
60
|
+
...sampleData,
|
|
61
|
+
title: 'Different Title'
|
|
62
|
+
});
|
|
63
|
+
expect(uri1.toString()).to.not.equal(uri2.toString());
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
describe('decode', () => {
|
|
68
|
+
|
|
69
|
+
it('should decode an encoded URI back to the original data', () => {
|
|
70
|
+
const uri = MultiDiffEditorUri.encode(sampleData);
|
|
71
|
+
const decoded = MultiDiffEditorUri.decode(uri);
|
|
72
|
+
expect(decoded.title).to.equal(sampleData.title);
|
|
73
|
+
expect(decoded.resources).to.have.length(2);
|
|
74
|
+
expect(decoded.resources[0].originalUri.toString()).to.equal(sampleData.resources[0].originalUri.toString());
|
|
75
|
+
expect(decoded.resources[0].modifiedUri.toString()).to.equal(sampleData.resources[0].modifiedUri.toString());
|
|
76
|
+
expect(decoded.resources[1].originalUri.toString()).to.equal(sampleData.resources[1].originalUri.toString());
|
|
77
|
+
expect(decoded.resources[1].modifiedUri.toString()).to.equal(sampleData.resources[1].modifiedUri.toString());
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('should throw for URIs with wrong scheme', () => {
|
|
81
|
+
const wrongUri = new URI('file:///some/path');
|
|
82
|
+
expect(() => MultiDiffEditorUri.decode(wrongUri)).to.throw('must have scheme multi-diff-editor');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('should throw for URIs whose query is not valid JSON', () => {
|
|
86
|
+
const malformedUri = new URI().withScheme('multi-diff-editor').withQuery('not-json');
|
|
87
|
+
expect(() => MultiDiffEditorUri.decode(malformedUri)).to.throw(/is not a valid URI for scheme multi-diff-editor/);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('should throw when the parsed payload is missing a title', () => {
|
|
91
|
+
const uri = new URI().withScheme('multi-diff-editor').withQuery(JSON.stringify({ resources: [] }));
|
|
92
|
+
expect(() => MultiDiffEditorUri.decode(uri)).to.throw(/is not a valid URI for scheme multi-diff-editor/);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it('should throw when the parsed payload is missing resources', () => {
|
|
96
|
+
const uri = new URI().withScheme('multi-diff-editor').withQuery(JSON.stringify({ title: 'x' }));
|
|
97
|
+
expect(() => MultiDiffEditorUri.decode(uri)).to.throw(/is not a valid URI for scheme multi-diff-editor/);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('should throw when a resource entry is not a string pair', () => {
|
|
101
|
+
const uri = new URI().withScheme('multi-diff-editor').withQuery(JSON.stringify({
|
|
102
|
+
title: 'x',
|
|
103
|
+
resources: [['only-one']]
|
|
104
|
+
}));
|
|
105
|
+
expect(() => MultiDiffEditorUri.decode(uri)).to.throw(/is not a valid URI for scheme multi-diff-editor/);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('should throw when a resource entry contains non-string values', () => {
|
|
109
|
+
const uri = new URI().withScheme('multi-diff-editor').withQuery(JSON.stringify({
|
|
110
|
+
title: 'x',
|
|
111
|
+
resources: [[123, 456]]
|
|
112
|
+
}));
|
|
113
|
+
expect(() => MultiDiffEditorUri.decode(uri)).to.throw(/is not a valid URI for scheme multi-diff-editor/);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('should throw when the payload is a primitive value', () => {
|
|
117
|
+
const uri = new URI().withScheme('multi-diff-editor').withQuery(JSON.stringify('not-an-object'));
|
|
118
|
+
expect(() => MultiDiffEditorUri.decode(uri)).to.throw(/is not a valid URI for scheme multi-diff-editor/);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
describe('isMultiDiffEditorUri', () => {
|
|
123
|
+
|
|
124
|
+
it('should return true for multi-diff-editor URIs', () => {
|
|
125
|
+
const uri = MultiDiffEditorUri.encode(sampleData);
|
|
126
|
+
expect(MultiDiffEditorUri.isMultiDiffEditorUri(uri)).to.be.true;
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it('should return false for other URIs', () => {
|
|
130
|
+
const uri = new URI('file:///some/path');
|
|
131
|
+
expect(MultiDiffEditorUri.isMultiDiffEditorUri(uri)).to.be.false;
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
describe('roundtrip', () => {
|
|
136
|
+
|
|
137
|
+
it('should handle empty resources list', () => {
|
|
138
|
+
const data: MultiDiffEditorUriData = {
|
|
139
|
+
title: 'Empty',
|
|
140
|
+
resources: []
|
|
141
|
+
};
|
|
142
|
+
const uri = MultiDiffEditorUri.encode(data);
|
|
143
|
+
const decoded = MultiDiffEditorUri.decode(uri);
|
|
144
|
+
expect(decoded.title).to.equal('Empty');
|
|
145
|
+
expect(decoded.resources).to.have.length(0);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it('should handle single resource', () => {
|
|
149
|
+
const data: MultiDiffEditorUriData = {
|
|
150
|
+
title: 'Single Change',
|
|
151
|
+
resources: [{
|
|
152
|
+
originalUri: new URI('file:///original/file.ts'),
|
|
153
|
+
modifiedUri: new URI('file:///modified/file.ts')
|
|
154
|
+
}]
|
|
155
|
+
};
|
|
156
|
+
const uri = MultiDiffEditorUri.encode(data);
|
|
157
|
+
const decoded = MultiDiffEditorUri.decode(uri);
|
|
158
|
+
expect(decoded.title).to.equal('Single Change');
|
|
159
|
+
expect(decoded.resources).to.have.length(1);
|
|
160
|
+
expect(decoded.resources[0].originalUri.toString()).to.equal(data.resources[0].originalUri.toString());
|
|
161
|
+
expect(decoded.resources[0].modifiedUri.toString()).to.equal(data.resources[0].modifiedUri.toString());
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it('should handle URIs with special characters', () => {
|
|
165
|
+
const data: MultiDiffEditorUriData = {
|
|
166
|
+
title: 'Special Chars: äöü & <test>',
|
|
167
|
+
resources: [{
|
|
168
|
+
originalUri: new URI('file:///path/with spaces/file.ts'),
|
|
169
|
+
modifiedUri: new URI('file:///path/with%20encoded/file.ts')
|
|
170
|
+
}]
|
|
171
|
+
};
|
|
172
|
+
const uri = MultiDiffEditorUri.encode(data);
|
|
173
|
+
const decoded = MultiDiffEditorUri.decode(uri);
|
|
174
|
+
expect(decoded.title).to.equal(data.title);
|
|
175
|
+
expect(decoded.resources[0].originalUri.toString()).to.equal(data.resources[0].originalUri.toString());
|
|
176
|
+
expect(decoded.resources[0].modifiedUri.toString()).to.equal(data.resources[0].modifiedUri.toString());
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it('should handle a title with slashes without confusing the URI path', () => {
|
|
180
|
+
const data: MultiDiffEditorUriData = {
|
|
181
|
+
title: 'changes/in/nested/path',
|
|
182
|
+
resources: []
|
|
183
|
+
};
|
|
184
|
+
const uri = MultiDiffEditorUri.encode(data);
|
|
185
|
+
const decoded = MultiDiffEditorUri.decode(uri);
|
|
186
|
+
expect(decoded.title).to.equal('changes/in/nested/path');
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
});
|