@codingame/monaco-vscode-multi-diff-editor-service-override 2.2.0-next.1

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.
@@ -0,0 +1,11 @@
1
+ function __decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ function __param(paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ }
10
+
11
+ export { __decorate, __param };
package/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export { default } from './multiDiffEditor.js';
package/index.js ADDED
@@ -0,0 +1 @@
1
+ export { default } from './multiDiffEditor.js';
@@ -0,0 +1,5 @@
1
+ import { IEditorOverrideServices } from 'vscode/vscode/vs/editor/standalone/browser/standaloneServices';
2
+
3
+ declare function getServiceOverride(): IEditorOverrideServices;
4
+
5
+ export { getServiceOverride as default };
@@ -0,0 +1,11 @@
1
+ import { SyncDescriptor } from 'vscode/vscode/vs/platform/instantiation/common/descriptors';
2
+ import { IMultiDiffSourceResolverService, MultiDiffSourceResolverService } from 'vscode/vscode/vs/workbench/contrib/multiDiffEditor/browser/multiDiffSourceResolverService';
3
+ import './vscode/src/vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditor.contribution.js';
4
+
5
+ function getServiceOverride() {
6
+ return {
7
+ [( IMultiDiffSourceResolverService.toString())]: new SyncDescriptor(MultiDiffSourceResolverService, [], true)
8
+ };
9
+ }
10
+
11
+ export { getServiceOverride as default };
package/package.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@codingame/monaco-vscode-multi-diff-editor-service-override",
3
+ "version": "2.2.0-next.1",
4
+ "keywords": [],
5
+ "author": {
6
+ "name": "CodinGame",
7
+ "url": "http://www.codingame.com"
8
+ },
9
+ "license": "MIT",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git@github.com:CodinGame/monaco-vscode-api.git"
13
+ },
14
+ "type": "module",
15
+ "private": false,
16
+ "description": "VSCode public API plugged on the monaco editor - multi-diff-editor service-override",
17
+ "main": "index.js",
18
+ "module": "index.js",
19
+ "types": "index.d.ts",
20
+ "dependencies": {
21
+ "vscode": "npm:@codingame/monaco-vscode-api@2.2.0-next.1",
22
+ "vscode-marked": "npm:marked@=3.0.2"
23
+ }
24
+ }
@@ -0,0 +1,16 @@
1
+ import { Event } from 'vscode/vscode/vs/base/common/event';
2
+
3
+ class ConstLazyPromise {
4
+ constructor(_value) {
5
+ this._value = _value;
6
+ this.onHasValueDidChange = Event.None;
7
+ }
8
+ request() {
9
+ return Promise.resolve(this._value);
10
+ }
11
+ get value() {
12
+ return this._value;
13
+ }
14
+ }
15
+
16
+ export { ConstLazyPromise };
@@ -0,0 +1,110 @@
1
+ import { Codicon } from 'vscode/vscode/vs/base/common/codicons';
2
+ import { EditorContextKeys } from 'vscode/vscode/vs/editor/common/editorContextKeys';
3
+ import { localize2WithPath } from 'vscode/vscode/vs/nls';
4
+ import { Action2, MenuId } from 'vscode/vscode/vs/platform/actions/common/actions';
5
+ import { ContextKeyExpr } from 'vscode/vscode/vs/platform/contextkey/common/contextkey';
6
+ import { TextFileEditor } from 'vscode/vscode/vs/workbench/contrib/files/browser/editors/textFileEditor';
7
+ import { MultiDiffEditor } from './multiDiffEditor.js';
8
+ import { MultiDiffEditorInput } from './multiDiffEditorInput.js';
9
+ import { IEditorService } from 'vscode/vscode/vs/workbench/services/editor/common/editorService';
10
+
11
+ class GoToFileAction extends Action2 {
12
+ constructor() {
13
+ super({
14
+ id: 'multiDiffEditor.goToFile',
15
+ title: ( localize2WithPath(
16
+ 'vs/workbench/contrib/multiDiffEditor/browser/actions',
17
+ 'goToFile',
18
+ 'Open File'
19
+ )),
20
+ icon: Codicon.goToFile,
21
+ precondition: EditorContextKeys.inMultiDiffEditor,
22
+ menu: {
23
+ when: EditorContextKeys.inMultiDiffEditor,
24
+ id: MenuId.MultiDiffEditorFileToolbar,
25
+ order: 22,
26
+ group: 'navigation',
27
+ },
28
+ });
29
+ }
30
+ async run(accessor, ...args) {
31
+ const uri = args[0];
32
+ const editorService = accessor.get(IEditorService);
33
+ const activeEditorPane = editorService.activeEditorPane;
34
+ let selections = undefined;
35
+ if (activeEditorPane instanceof MultiDiffEditor) {
36
+ const editor = activeEditorPane.tryGetCodeEditor(uri);
37
+ if (editor) {
38
+ selections = editor.editor.getSelections() ?? undefined;
39
+ }
40
+ }
41
+ const editor = await editorService.openEditor({ resource: uri });
42
+ if (selections && (editor instanceof TextFileEditor)) {
43
+ const c = editor.getControl();
44
+ if (c) {
45
+ c.setSelections(selections);
46
+ c.revealLineInCenter(selections[0].selectionStartLineNumber);
47
+ }
48
+ }
49
+ }
50
+ }
51
+ class CollapseAllAction extends Action2 {
52
+ constructor() {
53
+ super({
54
+ id: 'multiDiffEditor.collapseAll',
55
+ title: ( localize2WithPath(
56
+ 'vs/workbench/contrib/multiDiffEditor/browser/actions',
57
+ 'collapseAllDiffs',
58
+ 'Collapse All Diffs'
59
+ )),
60
+ icon: Codicon.collapseAll,
61
+ precondition: ( ContextKeyExpr.and(( ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID)), ContextKeyExpr.not('multiDiffEditorAllCollapsed'))),
62
+ menu: {
63
+ when: ( ContextKeyExpr.and(( ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID)), ContextKeyExpr.not('multiDiffEditorAllCollapsed'))),
64
+ id: MenuId.EditorTitle,
65
+ group: 'navigation',
66
+ order: 100
67
+ },
68
+ f1: true,
69
+ });
70
+ }
71
+ async run(accessor, ...args) {
72
+ const editorService = accessor.get(IEditorService);
73
+ const activeEditor = editorService.activeEditor;
74
+ if (activeEditor instanceof MultiDiffEditorInput) {
75
+ const viewModel = await activeEditor.getViewModel();
76
+ viewModel.collapseAll();
77
+ }
78
+ }
79
+ }
80
+ class ExpandAllAction extends Action2 {
81
+ constructor() {
82
+ super({
83
+ id: 'multiDiffEditor.expandAll',
84
+ title: ( localize2WithPath(
85
+ 'vs/workbench/contrib/multiDiffEditor/browser/actions',
86
+ 'ExpandAllDiffs',
87
+ 'Expand All Diffs'
88
+ )),
89
+ icon: Codicon.expandAll,
90
+ precondition: ( ContextKeyExpr.and(( ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID)), ( ContextKeyExpr.has('multiDiffEditorAllCollapsed')))),
91
+ menu: {
92
+ when: ( ContextKeyExpr.and(( ContextKeyExpr.equals('activeEditor', MultiDiffEditor.ID)), ( ContextKeyExpr.has('multiDiffEditorAllCollapsed')))),
93
+ id: MenuId.EditorTitle,
94
+ group: 'navigation',
95
+ order: 100
96
+ },
97
+ f1: true,
98
+ });
99
+ }
100
+ async run(accessor, ...args) {
101
+ const editorService = accessor.get(IEditorService);
102
+ const activeEditor = editorService.activeEditor;
103
+ if (activeEditor instanceof MultiDiffEditorInput) {
104
+ const viewModel = await activeEditor.getViewModel();
105
+ viewModel.expandAll();
106
+ }
107
+ }
108
+ }
109
+
110
+ export { CollapseAllAction, ExpandAllAction, GoToFileAction };
@@ -0,0 +1,11 @@
1
+ import { Codicon } from 'vscode/vscode/vs/base/common/codicons';
2
+ import { localizeWithPath } from 'vscode/vscode/vs/nls';
3
+ import { registerIcon } from 'vscode/vscode/vs/platform/theme/common/iconRegistry';
4
+
5
+ const MultiDiffEditorIcon = registerIcon('multi-diff-editor-label-icon', Codicon.diffMultiple, ( localizeWithPath(
6
+ 'vs/workbench/contrib/multiDiffEditor/browser/icons.contribution',
7
+ 'multiDiffEditorLabelIcon',
8
+ 'Icon of the multi diff editor label.'
9
+ )));
10
+
11
+ export { MultiDiffEditorIcon };
@@ -0,0 +1,39 @@
1
+ import { localizeWithPath } from 'vscode/vscode/vs/nls';
2
+ import { registerAction2 } from 'vscode/vscode/vs/platform/actions/common/actions';
3
+ import { Extensions } from 'vscode/vscode/vs/platform/configuration/common/configurationRegistry';
4
+ import { SyncDescriptor } from 'vscode/vscode/vs/platform/instantiation/common/descriptors';
5
+ import { Registry } from 'vscode/vscode/vs/platform/registry/common/platform';
6
+ import { EditorPaneDescriptor } from 'vscode/vscode/vs/workbench/browser/editor';
7
+ import { Extensions as Extensions$1 } from 'vscode/vscode/vs/workbench/common/contributions';
8
+ import { EditorExtensions } from 'vscode/vscode/vs/workbench/common/editor';
9
+ import { MultiDiffEditor } from './multiDiffEditor.js';
10
+ import { MultiDiffEditorResolverContribution, MultiDiffEditorInput, MultiDiffEditorSerializer } from './multiDiffEditorInput.js';
11
+ import { GoToFileAction, CollapseAllAction, ExpandAllAction } from './actions.js';
12
+ import { OpenScmGroupAction, ScmMultiDiffSourceResolverContribution } from './scmMultiDiffSourceResolver.js';
13
+
14
+ registerAction2(GoToFileAction);
15
+ registerAction2(CollapseAllAction);
16
+ registerAction2(ExpandAllAction);
17
+ ( Registry.as(Extensions.Configuration))
18
+ .registerConfiguration({
19
+ properties: {
20
+ 'multiDiffEditor.experimental.enabled': {
21
+ type: 'boolean',
22
+ default: true,
23
+ description: 'Enable experimental multi diff editor.',
24
+ },
25
+ }
26
+ });
27
+ ( Registry.as(Extensions$1.Workbench))
28
+ .registerWorkbenchContribution(MultiDiffEditorResolverContribution, 1 );
29
+ ( Registry.as(EditorExtensions.EditorPane))
30
+ .registerEditorPane(EditorPaneDescriptor.create(MultiDiffEditor, MultiDiffEditor.ID, ( localizeWithPath(
31
+ 'vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditor.contribution',
32
+ 'name',
33
+ "Multi Diff Editor"
34
+ ))), [( new SyncDescriptor(MultiDiffEditorInput))]);
35
+ ( Registry.as(EditorExtensions.EditorFactory))
36
+ .registerEditorSerializer(MultiDiffEditorInput.ID, MultiDiffEditorSerializer);
37
+ registerAction2(OpenScmGroupAction);
38
+ ( Registry.as(Extensions$1.Workbench))
39
+ .registerWorkbenchContribution(ScmMultiDiffSourceResolverContribution, 1 );
@@ -0,0 +1,97 @@
1
+ import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
2
+ import { MultiDiffEditorWidget } from 'vscode/vscode/vs/editor/browser/widget/multiDiffEditorWidget/multiDiffEditorWidget';
3
+ import { ITextResourceConfigurationService } from 'vscode/vscode/vs/editor/common/services/textResourceConfiguration';
4
+ import { IInstantiationService } from 'vscode/vscode/vs/platform/instantiation/common/instantiation';
5
+ import { IStorageService } from 'vscode/vscode/vs/platform/storage/common/storage';
6
+ import { ITelemetryService } from 'vscode/vscode/vs/platform/telemetry/common/telemetry';
7
+ import { IThemeService } from 'vscode/vscode/vs/platform/theme/common/themeService';
8
+ import { ResourceLabel } from 'vscode/vscode/vs/workbench/browser/labels';
9
+ import { AbstractEditorWithViewState } from 'vscode/vscode/vs/workbench/browser/parts/editor/editorWithViewState';
10
+ import { MultiDiffEditorInput } from './multiDiffEditorInput.js';
11
+ import { IEditorGroupsService } from 'vscode/vscode/vs/workbench/services/editor/common/editorGroupsService';
12
+ import { IEditorService } from 'vscode/vscode/vs/workbench/services/editor/common/editorService';
13
+
14
+ var MultiDiffEditor_1;
15
+ let MultiDiffEditor = class MultiDiffEditor extends AbstractEditorWithViewState {
16
+ static { MultiDiffEditor_1 = this; }
17
+ static { this.ID = 'multiDiffEditor'; }
18
+ get viewModel() {
19
+ return this._viewModel;
20
+ }
21
+ constructor(instantiationService, telemetryService, themeService, storageService, editorService, editorGroupService, textResourceConfigurationService) {
22
+ super(MultiDiffEditor_1.ID, 'multiDiffEditor', telemetryService, instantiationService, storageService, textResourceConfigurationService, themeService, editorService, editorGroupService);
23
+ this._multiDiffEditorWidget = undefined;
24
+ }
25
+ createEditor(parent) {
26
+ this._multiDiffEditorWidget = this._register(this.instantiationService.createInstance(MultiDiffEditorWidget, parent, this.instantiationService.createInstance(WorkbenchUIElementFactory)));
27
+ this._register(this._multiDiffEditorWidget.onDidChangeActiveControl(() => {
28
+ this._onDidChangeControl.fire();
29
+ }));
30
+ }
31
+ async setInput(input, options, context, token) {
32
+ await super.setInput(input, options, context, token);
33
+ this._viewModel = await input.getViewModel();
34
+ this._multiDiffEditorWidget.setViewModel(this._viewModel);
35
+ const viewState = this.loadEditorViewState(input, context);
36
+ if (viewState) {
37
+ this._multiDiffEditorWidget.setViewState(viewState);
38
+ }
39
+ }
40
+ async clearInput() {
41
+ await super.clearInput();
42
+ this._multiDiffEditorWidget.setViewModel(undefined);
43
+ }
44
+ layout(dimension) {
45
+ this._multiDiffEditorWidget.layout(dimension);
46
+ }
47
+ getControl() {
48
+ return this._multiDiffEditorWidget.getActiveControl();
49
+ }
50
+ computeEditorViewState(resource) {
51
+ return this._multiDiffEditorWidget.getViewState();
52
+ }
53
+ tracksEditorViewState(input) {
54
+ return input instanceof MultiDiffEditorInput;
55
+ }
56
+ toEditorViewStateResource(input) {
57
+ return input.resource;
58
+ }
59
+ tryGetCodeEditor(resource) {
60
+ return this._multiDiffEditorWidget.tryGetCodeEditor(resource);
61
+ }
62
+ };
63
+ MultiDiffEditor = MultiDiffEditor_1 = ( __decorate([
64
+ ( __param(0, IInstantiationService)),
65
+ ( __param(1, ITelemetryService)),
66
+ ( __param(2, IThemeService)),
67
+ ( __param(3, IStorageService)),
68
+ ( __param(4, IEditorService)),
69
+ ( __param(5, IEditorGroupsService)),
70
+ ( __param(6, ITextResourceConfigurationService))
71
+ ], MultiDiffEditor));
72
+ let WorkbenchUIElementFactory = class WorkbenchUIElementFactory {
73
+ constructor(_instantiationService) {
74
+ this._instantiationService = _instantiationService;
75
+ }
76
+ createResourceLabel(element) {
77
+ const label = this._instantiationService.createInstance(ResourceLabel, element, {});
78
+ return {
79
+ setUri(uri, options = {}) {
80
+ if (!uri) {
81
+ label.element.clear();
82
+ }
83
+ else {
84
+ label.element.setFile(uri, { strikethrough: options.strikethrough });
85
+ }
86
+ },
87
+ dispose() {
88
+ label.dispose();
89
+ }
90
+ };
91
+ }
92
+ };
93
+ WorkbenchUIElementFactory = ( __decorate([
94
+ ( __param(0, IInstantiationService))
95
+ ], WorkbenchUIElementFactory));
96
+
97
+ export { MultiDiffEditor };
@@ -0,0 +1,302 @@
1
+ import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
2
+ import { LazyStatefulPromise, raceTimeout } from 'vscode/vscode/vs/base/common/async';
3
+ import { BugIndicatingError, onUnexpectedError } from 'vscode/vscode/vs/base/common/errors';
4
+ import { Event, Emitter } from 'vscode/vscode/vs/base/common/event';
5
+ import { DisposableStore, toDisposable, Disposable } from 'vscode/vscode/vs/base/common/lifecycle';
6
+ import { parse } from 'vscode/vscode/vs/base/common/marshalling';
7
+ import { Schemas } from 'vscode/vscode/vs/base/common/network';
8
+ import { deepClone } from 'vscode/vscode/vs/base/common/objects';
9
+ import { observableFromEvent, constObservable, mapObservableArrayCached } from 'vscode/vscode/vs/base/common/observableInternal/utils';
10
+ import { isDefined, isObject } from 'vscode/vscode/vs/base/common/types';
11
+ import { URI } from 'vscode/vscode/vs/base/common/uri';
12
+ import { ConstLazyPromise } from '../../../../editor/browser/widget/multiDiffEditorWidget/model.js';
13
+ import { MultiDiffEditorViewModel } from 'vscode/vscode/vs/editor/browser/widget/multiDiffEditorWidget/multiDiffEditorViewModel';
14
+ import { ITextModelService } from 'vscode/vscode/vs/editor/common/services/resolverService';
15
+ import { ITextResourceConfigurationService } from 'vscode/vscode/vs/editor/common/services/textResourceConfiguration';
16
+ import { localizeWithPath } from 'vscode/vscode/vs/nls';
17
+ import { IInstantiationService } from 'vscode/vscode/vs/platform/instantiation/common/instantiation';
18
+ import { DEFAULT_EDITOR_ASSOCIATION } from 'vscode/vscode/vs/workbench/common/editor';
19
+ import { EditorInput } from 'vscode/vscode/vs/workbench/common/editor/editorInput';
20
+ import { MultiDiffEditorIcon } from './icons.contribution.js';
21
+ import { MultiDiffEditorItem, ConstResolvedMultiDiffSource, IMultiDiffSourceResolverService } from 'vscode/vscode/vs/workbench/contrib/multiDiffEditor/browser/multiDiffSourceResolverService';
22
+ import { ObservableLazyStatefulPromise } from './utils.js';
23
+ import { RegisteredEditorPriority, IEditorResolverService } from 'vscode/vscode/vs/workbench/services/editor/common/editorResolverService';
24
+ import { ITextFileService } from 'vscode/vscode/vs/workbench/services/textfile/common/textfiles';
25
+ import { derived } from 'vscode/vscode/vs/base/common/observableInternal/derived';
26
+ import { autorun } from 'vscode/vscode/vs/base/common/observableInternal/autorun';
27
+
28
+ var MultiDiffEditorInput_1;
29
+ let MultiDiffEditorInput = class MultiDiffEditorInput extends EditorInput {
30
+ static { MultiDiffEditorInput_1 = this; }
31
+ static fromResourceMultiDiffEditorInput(input, instantiationService) {
32
+ if (!input.multiDiffSource && !input.resources) {
33
+ throw new BugIndicatingError('MultiDiffEditorInput requires either multiDiffSource or resources');
34
+ }
35
+ const multiDiffSource = input.multiDiffSource ?? ( URI.parse(`multi-diff-editor:${( ( new Date()).getMilliseconds().toString()) + ( Math.random().toString())}`));
36
+ return instantiationService.createInstance(MultiDiffEditorInput_1, multiDiffSource, input.label, input.resources?.map(resource => {
37
+ return ( new MultiDiffEditorItem(resource.original.resource, resource.modified.resource));
38
+ }));
39
+ }
40
+ static fromSerialized(data, instantiationService) {
41
+ return instantiationService.createInstance(MultiDiffEditorInput_1, ( URI.parse(data.multiDiffSourceUri)), data.label, data.resources?.map(resource => ( new MultiDiffEditorItem(resource.originalUri ? ( URI.parse(resource.originalUri)) : undefined, resource.modifiedUri ? ( URI.parse(resource.modifiedUri)) : undefined))));
42
+ }
43
+ static { this.ID = 'workbench.input.multiDiffEditor'; }
44
+ get resource() { return this.multiDiffSource; }
45
+ get capabilities() { return 2 ; }
46
+ get typeId() { return MultiDiffEditorInput_1.ID; }
47
+ getName() { return this._name; }
48
+ get editorId() { return DEFAULT_EDITOR_ASSOCIATION.id; }
49
+ getIcon() { return MultiDiffEditorIcon; }
50
+ constructor(multiDiffSource, label, initialResources, _textModelService, _textResourceConfigurationService, _instantiationService, _multiDiffSourceResolverService, _textFileService) {
51
+ super();
52
+ this.multiDiffSource = multiDiffSource;
53
+ this.label = label;
54
+ this.initialResources = initialResources;
55
+ this._textModelService = _textModelService;
56
+ this._textResourceConfigurationService = _textResourceConfigurationService;
57
+ this._instantiationService = _instantiationService;
58
+ this._multiDiffSourceResolverService = _multiDiffSourceResolverService;
59
+ this._textFileService = _textFileService;
60
+ this._name = '';
61
+ this._viewModel = ( new LazyStatefulPromise(async () => {
62
+ const model = await this._createModel();
63
+ this._register(model);
64
+ const vm = ( new MultiDiffEditorViewModel(model, this._instantiationService));
65
+ this._register(vm);
66
+ await raceTimeout(vm.waitForDiffs(), 1000);
67
+ return vm;
68
+ }));
69
+ this._resolvedSource = ( new ObservableLazyStatefulPromise(async () => {
70
+ const source = this.initialResources
71
+ ? ( new ConstResolvedMultiDiffSource(this.initialResources))
72
+ : await this._multiDiffSourceResolverService.resolve(this.multiDiffSource);
73
+ return {
74
+ source,
75
+ resources: source ? observableFromEvent(source.onDidChange, () => source.resources) : constObservable([]),
76
+ };
77
+ }));
78
+ this._resources = derived(this, reader => this._resolvedSource.cachedValue.read(reader)?.value?.resources.read(reader));
79
+ this._isDirtyObservables = mapObservableArrayCached(this, ( this._resources.map(r => r || [])), res => {
80
+ const isModifiedDirty = res.modified ? isUriDirty(this._textFileService, res.modified) : constObservable(false);
81
+ const isOriginalDirty = res.original ? isUriDirty(this._textFileService, res.original) : constObservable(false);
82
+ return derived(reader => isModifiedDirty.read(reader) || isOriginalDirty.read(reader));
83
+ }, i => JSON.stringify([i.modified?.toString(), i.original?.toString()]));
84
+ this._isDirtyObservable = derived(this, reader => ( this._isDirtyObservables.read(reader).some(isDirty => isDirty.read(reader))))
85
+ .keepObserved(this._store);
86
+ this.onDidChangeDirty = Event.fromObservableLight(this._isDirtyObservable);
87
+ this.closeHandler = {
88
+ async confirm() {
89
+ return 1 ;
90
+ },
91
+ showConfirm() {
92
+ return false;
93
+ }
94
+ };
95
+ this._register(autorun((reader) => {
96
+ const resources = this._resources.read(reader) ?? [];
97
+ const label = this.label ?? ( localizeWithPath(
98
+ 'vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput',
99
+ 'name',
100
+ "Multi Diff Editor"
101
+ ));
102
+ this._name = label + ( localizeWithPath(
103
+ 'vs/workbench/contrib/multiDiffEditor/browser/multiDiffEditorInput',
104
+ 'files',
105
+ " ({0} files)",
106
+ resources?.length ?? 0
107
+ ));
108
+ this._onDidChangeLabel.fire();
109
+ }));
110
+ }
111
+ serialize() {
112
+ return {
113
+ label: this.label,
114
+ multiDiffSourceUri: ( this.multiDiffSource.toString()),
115
+ resources: this.initialResources?.map(resource => ({
116
+ originalUri: resource.original?.toString(),
117
+ modifiedUri: resource.modified?.toString(),
118
+ })),
119
+ };
120
+ }
121
+ setLanguageId(languageId, source) {
122
+ const activeDiffItem = this._viewModel.requireValue().activeDiffItem.get();
123
+ const value = activeDiffItem?.entry?.value;
124
+ if (!value) {
125
+ return;
126
+ }
127
+ const target = value.modified ?? value.original;
128
+ if (!target) {
129
+ return;
130
+ }
131
+ target.setLanguage(languageId, source);
132
+ }
133
+ async getViewModel() {
134
+ return this._viewModel.getPromise();
135
+ }
136
+ async _createModel() {
137
+ const source = await this._resolvedSource.getValue();
138
+ const textResourceConfigurationService = this._textResourceConfigurationService;
139
+ const garbage = ( new DisposableStore());
140
+ const documentsWithPromises = mapObservableArrayCached(undefined, source.resources, async (r, store) => {
141
+ let original;
142
+ let modified;
143
+ const store2 = ( new DisposableStore());
144
+ store.add(toDisposable(() => {
145
+ garbage.add(store2);
146
+ }));
147
+ try {
148
+ [original, modified] = await Promise.all([
149
+ r.original ? this._textModelService.createModelReference(r.original) : undefined,
150
+ r.modified ? this._textModelService.createModelReference(r.modified) : undefined,
151
+ ]);
152
+ if (original) {
153
+ store.add(original);
154
+ }
155
+ if (modified) {
156
+ store.add(modified);
157
+ }
158
+ }
159
+ catch (e) {
160
+ console.error(e);
161
+ onUnexpectedError(e);
162
+ return undefined;
163
+ }
164
+ const uri = (r.modified ?? r.original);
165
+ return ( new ConstLazyPromise({
166
+ original: original?.object.textEditorModel,
167
+ modified: modified?.object.textEditorModel,
168
+ get options() {
169
+ return {
170
+ ...getReadonlyConfiguration(modified?.object.isReadonly() ?? true),
171
+ ...computeOptions(textResourceConfigurationService.getValue(uri)),
172
+ };
173
+ },
174
+ onOptionsDidChange: h => this._textResourceConfigurationService.onDidChangeConfiguration(e => {
175
+ if (e.affectsConfiguration(uri, 'editor') || e.affectsConfiguration(uri, 'diffEditor')) {
176
+ h();
177
+ }
178
+ }),
179
+ }));
180
+ }, i => JSON.stringify([i.modified?.toString(), i.original?.toString()]));
181
+ let documents = [];
182
+ const documentChangeEmitter = ( new Emitter());
183
+ const p = Event.toPromise(documentChangeEmitter.event);
184
+ const a = autorun(async (reader) => {
185
+ const docsPromises = documentsWithPromises.read(reader);
186
+ const docs = await Promise.all(docsPromises);
187
+ documents = docs.filter(isDefined);
188
+ documentChangeEmitter.fire();
189
+ garbage.clear();
190
+ });
191
+ await p;
192
+ return {
193
+ dispose: () => {
194
+ a.dispose();
195
+ garbage.dispose();
196
+ },
197
+ onDidChange: documentChangeEmitter.event,
198
+ get documents() { return documents; },
199
+ contextKeys: source.source?.contextKeys,
200
+ };
201
+ }
202
+ matches(otherInput) {
203
+ if (super.matches(otherInput)) {
204
+ return true;
205
+ }
206
+ if (otherInput instanceof MultiDiffEditorInput_1) {
207
+ return ( this.multiDiffSource.toString()) === ( otherInput.multiDiffSource.toString());
208
+ }
209
+ return false;
210
+ }
211
+ isDirty() { return this._isDirtyObservable.get(); }
212
+ async save(group, options) {
213
+ await this.doSaveOrRevert('save', group, options);
214
+ return this;
215
+ }
216
+ revert(group, options) {
217
+ return this.doSaveOrRevert('revert', group, options);
218
+ }
219
+ async doSaveOrRevert(mode, group, options) {
220
+ const items = this._viewModel.currentValue?.items.get();
221
+ if (items) {
222
+ await Promise.all(( items.map(async (item) => {
223
+ const model = item.diffEditorViewModel.model;
224
+ const handleOriginal = model.original.uri.scheme !== Schemas.untitled && this._textFileService.isDirty(model.original.uri);
225
+ await Promise.all([
226
+ handleOriginal ? mode === 'save' ? this._textFileService.save(model.original.uri, options) : this._textFileService.revert(model.original.uri, options) : Promise.resolve(),
227
+ mode === 'save' ? this._textFileService.save(model.modified.uri, options) : this._textFileService.revert(model.modified.uri, options),
228
+ ]);
229
+ })));
230
+ }
231
+ return undefined;
232
+ }
233
+ };
234
+ MultiDiffEditorInput = MultiDiffEditorInput_1 = ( __decorate([
235
+ ( __param(3, ITextModelService)),
236
+ ( __param(4, ITextResourceConfigurationService)),
237
+ ( __param(5, IInstantiationService)),
238
+ ( __param(6, IMultiDiffSourceResolverService)),
239
+ ( __param(7, ITextFileService))
240
+ ], MultiDiffEditorInput));
241
+ function isUriDirty(textFileService, uri) {
242
+ return observableFromEvent(Event.filter(textFileService.files.onDidChangeDirty, e => ( e.resource.toString()) === ( uri.toString())), () => textFileService.isDirty(uri));
243
+ }
244
+ function getReadonlyConfiguration(isReadonly) {
245
+ return {
246
+ readOnly: !!isReadonly,
247
+ readOnlyMessage: typeof isReadonly !== 'boolean' ? isReadonly : undefined
248
+ };
249
+ }
250
+ function computeOptions(configuration) {
251
+ const editorConfiguration = deepClone(configuration.editor);
252
+ if (isObject(configuration.diffEditor)) {
253
+ const diffEditorConfiguration = deepClone(configuration.diffEditor);
254
+ diffEditorConfiguration.diffCodeLens = diffEditorConfiguration.codeLens;
255
+ delete diffEditorConfiguration.codeLens;
256
+ diffEditorConfiguration.diffWordWrap = diffEditorConfiguration.wordWrap;
257
+ delete diffEditorConfiguration.wordWrap;
258
+ Object.assign(editorConfiguration, diffEditorConfiguration);
259
+ }
260
+ return editorConfiguration;
261
+ }
262
+ let MultiDiffEditorResolverContribution = class MultiDiffEditorResolverContribution extends Disposable {
263
+ constructor(editorResolverService, instantiationService) {
264
+ super();
265
+ this._register(editorResolverService.registerEditor(`*`, {
266
+ id: DEFAULT_EDITOR_ASSOCIATION.id,
267
+ label: DEFAULT_EDITOR_ASSOCIATION.displayName,
268
+ detail: DEFAULT_EDITOR_ASSOCIATION.providerDisplayName,
269
+ priority: RegisteredEditorPriority.builtin
270
+ }, {}, {
271
+ createMultiDiffEditorInput: (diffListEditor) => {
272
+ return {
273
+ editor: MultiDiffEditorInput.fromResourceMultiDiffEditorInput(diffListEditor, instantiationService),
274
+ };
275
+ },
276
+ }));
277
+ }
278
+ };
279
+ MultiDiffEditorResolverContribution = ( __decorate([
280
+ ( __param(0, IEditorResolverService)),
281
+ ( __param(1, IInstantiationService))
282
+ ], MultiDiffEditorResolverContribution));
283
+ class MultiDiffEditorSerializer {
284
+ canSerialize(editor) {
285
+ return editor instanceof MultiDiffEditorInput;
286
+ }
287
+ serialize(editor) {
288
+ return JSON.stringify(editor.serialize());
289
+ }
290
+ deserialize(instantiationService, serializedEditor) {
291
+ try {
292
+ const data = parse(serializedEditor);
293
+ return MultiDiffEditorInput.fromSerialized(data, instantiationService);
294
+ }
295
+ catch (err) {
296
+ onUnexpectedError(err);
297
+ return undefined;
298
+ }
299
+ }
300
+ }
301
+
302
+ export { MultiDiffEditorInput, MultiDiffEditorResolverContribution, MultiDiffEditorSerializer };
@@ -0,0 +1,144 @@
1
+ import { __decorate, __param } from '../../../../../../../external/tslib/tslib.es6.js';
2
+ import { Codicon } from 'vscode/vscode/vs/base/common/codicons';
3
+ import { Event } from 'vscode/vscode/vs/base/common/event';
4
+ import { Disposable } from 'vscode/vscode/vs/base/common/lifecycle';
5
+ import { URI } from 'vscode/vscode/vs/base/common/uri';
6
+ import { localize2WithPath, localizeWithPath } from 'vscode/vscode/vs/nls';
7
+ import { Action2, MenuId } from 'vscode/vscode/vs/platform/actions/common/actions';
8
+ import { ContextKeyExpr } from 'vscode/vscode/vs/platform/contextkey/common/contextkey';
9
+ import { IInstantiationService } from 'vscode/vscode/vs/platform/instantiation/common/instantiation';
10
+ import { IMultiDiffSourceResolverService } from 'vscode/vscode/vs/workbench/contrib/multiDiffEditor/browser/multiDiffSourceResolverService';
11
+ import { ISCMService } from 'vscode/vscode/vs/workbench/contrib/scm/common/scm';
12
+ import { IEditorService } from 'vscode/vscode/vs/workbench/services/editor/common/editorService';
13
+ import { observableFromEvent } from 'vscode/vscode/vs/base/common/observableInternal/utils';
14
+
15
+ var ScmMultiDiffSourceResolver_1;
16
+ let ScmMultiDiffSourceResolver = class ScmMultiDiffSourceResolver {
17
+ static { ScmMultiDiffSourceResolver_1 = this; }
18
+ static { this._scheme = 'scm-multi-diff-source'; }
19
+ static getMultiDiffSourceUri(repositoryUri, groupId) {
20
+ return ( URI.from({
21
+ scheme: ScmMultiDiffSourceResolver_1._scheme,
22
+ query: JSON.stringify({ repositoryUri, groupId }),
23
+ }));
24
+ }
25
+ static parseUri(uri) {
26
+ if (uri.scheme !== ScmMultiDiffSourceResolver_1._scheme) {
27
+ return undefined;
28
+ }
29
+ let query;
30
+ try {
31
+ query = JSON.parse(uri.query);
32
+ }
33
+ catch (e) {
34
+ return undefined;
35
+ }
36
+ if (typeof query !== 'object' || query === null) {
37
+ return undefined;
38
+ }
39
+ const { repositoryUri, groupId } = query;
40
+ if (typeof repositoryUri !== 'string' || typeof groupId !== 'string') {
41
+ return undefined;
42
+ }
43
+ return { repositoryUri: ( URI.parse(repositoryUri)), groupId };
44
+ }
45
+ constructor(_scmService) {
46
+ this._scmService = _scmService;
47
+ }
48
+ canHandleUri(uri) {
49
+ return ScmMultiDiffSourceResolver_1.parseUri(uri) !== undefined;
50
+ }
51
+ async resolveDiffSource(uri) {
52
+ const { repositoryUri, groupId } = ScmMultiDiffSourceResolver_1.parseUri(uri);
53
+ const repository = await promiseFromEventState(this._scmService.onDidAddRepository, () => {
54
+ const repository = [...this._scmService.repositories].find(r => r.provider.rootUri?.toString() === ( repositoryUri.toString()));
55
+ return repository ?? false;
56
+ });
57
+ const group = await promiseFromEventState(repository.provider.onDidChangeResourceGroups, () => {
58
+ const group = repository.provider.groups.find(g => g.id === groupId);
59
+ return group ?? false;
60
+ });
61
+ const resources = observableFromEvent(group.onDidChangeResources, () => ( group.resources.map(e => {
62
+ return {
63
+ original: e.multiDiffEditorOriginalUri,
64
+ modified: e.multiDiffEditorModifiedUri
65
+ };
66
+ })));
67
+ return ( new ScmResolvedMultiDiffSource(resources, {
68
+ scmResourceGroup: groupId,
69
+ scmProvider: repository.provider.contextValue,
70
+ }));
71
+ }
72
+ };
73
+ ScmMultiDiffSourceResolver = ScmMultiDiffSourceResolver_1 = ( __decorate([
74
+ ( __param(0, ISCMService))
75
+ ], ScmMultiDiffSourceResolver));
76
+ class ScmResolvedMultiDiffSource {
77
+ get resources() { return this._resources.get(); }
78
+ constructor(_resources, contextKeys) {
79
+ this._resources = _resources;
80
+ this.contextKeys = contextKeys;
81
+ this.onDidChange = Event.fromObservableLight(this._resources);
82
+ }
83
+ }
84
+ function promiseFromEventState(event, checkState) {
85
+ const state = checkState();
86
+ if (state) {
87
+ return Promise.resolve(state);
88
+ }
89
+ return ( new Promise(resolve => {
90
+ const listener = event(() => {
91
+ const state = checkState();
92
+ if (state) {
93
+ listener.dispose();
94
+ resolve(state);
95
+ }
96
+ });
97
+ }));
98
+ }
99
+ let ScmMultiDiffSourceResolverContribution = class ScmMultiDiffSourceResolverContribution extends Disposable {
100
+ constructor(instantiationService, multiDiffSourceResolverService) {
101
+ super();
102
+ this._register(multiDiffSourceResolverService.registerResolver(instantiationService.createInstance(ScmMultiDiffSourceResolver)));
103
+ }
104
+ };
105
+ ScmMultiDiffSourceResolverContribution = ( __decorate([
106
+ ( __param(0, IInstantiationService)),
107
+ ( __param(1, IMultiDiffSourceResolverService))
108
+ ], ScmMultiDiffSourceResolverContribution));
109
+ class OpenScmGroupAction extends Action2 {
110
+ constructor() {
111
+ super({
112
+ id: 'multiDiffEditor.openScmDiff',
113
+ title: ( localize2WithPath(
114
+ 'vs/workbench/contrib/multiDiffEditor/browser/scmMultiDiffSourceResolver',
115
+ 'viewChanges',
116
+ 'View Changes'
117
+ )),
118
+ icon: Codicon.diffMultiple,
119
+ menu: {
120
+ when: ( ContextKeyExpr.and(( ContextKeyExpr.has('config.multiDiffEditor.experimental.enabled')), ( ContextKeyExpr.has('multiDiffEditorEnableViewChanges')))),
121
+ id: MenuId.SCMResourceGroupContext,
122
+ group: 'inline',
123
+ },
124
+ f1: false,
125
+ });
126
+ }
127
+ async run(accessor, group) {
128
+ const editorService = accessor.get(IEditorService);
129
+ if (!group.provider.rootUri) {
130
+ return;
131
+ }
132
+ const multiDiffSource = ScmMultiDiffSourceResolver.getMultiDiffSourceUri(( group.provider.rootUri.toString()), group.id);
133
+ const label = ( localizeWithPath(
134
+ 'vs/workbench/contrib/multiDiffEditor/browser/scmMultiDiffSourceResolver',
135
+ 'scmDiffLabel',
136
+ '{0}: {1}',
137
+ group.provider.label,
138
+ group.label
139
+ ));
140
+ await editorService.openEditor({ label, multiDiffSource });
141
+ }
142
+ }
143
+
144
+ export { OpenScmGroupAction, ScmMultiDiffSourceResolver, ScmMultiDiffSourceResolverContribution };
@@ -0,0 +1,57 @@
1
+ import { derived } from 'vscode/vscode/vs/base/common/observableInternal/derived';
2
+ import { observableValue } from 'vscode/vscode/vs/base/common/observableInternal/base';
3
+
4
+ class ObservableLazy {
5
+ get cachedValue() { return this._value; }
6
+ constructor(_computeValue) {
7
+ this._computeValue = _computeValue;
8
+ this._value = observableValue(this, undefined);
9
+ }
10
+ getValue() {
11
+ let v = this._value.get();
12
+ if (!v) {
13
+ v = this._computeValue();
14
+ this._value.set(v, undefined);
15
+ }
16
+ return v;
17
+ }
18
+ }
19
+ class ObservablePromise {
20
+ constructor(promise) {
21
+ this._value = observableValue(this, undefined);
22
+ this.value = this._value;
23
+ this.promise = promise.then(value => {
24
+ this._value.set(( new PromiseResult(value, undefined)), undefined);
25
+ return value;
26
+ }, error => {
27
+ this._value.set(( new PromiseResult(undefined, error)), undefined);
28
+ throw error;
29
+ });
30
+ }
31
+ }
32
+ class PromiseResult {
33
+ constructor(
34
+ value,
35
+ error) {
36
+ this.value = value;
37
+ this.error = error;
38
+ }
39
+ getValue() {
40
+ if (this.error) {
41
+ throw this.error;
42
+ }
43
+ return this.value;
44
+ }
45
+ }
46
+ class ObservableLazyStatefulPromise {
47
+ constructor(_computeValue) {
48
+ this._computeValue = _computeValue;
49
+ this._lazyValue = ( new ObservableLazy(() => ( new ObservablePromise(this._computeValue()))));
50
+ this.cachedValue = derived(this, reader => this._lazyValue.cachedValue.read(reader)?.value.read(reader));
51
+ }
52
+ getValue() {
53
+ return this._lazyValue.getValue().promise;
54
+ }
55
+ }
56
+
57
+ export { ObservableLazy, ObservableLazyStatefulPromise, ObservablePromise, PromiseResult };