@codingame/monaco-vscode-api 4.1.2 → 4.2.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/README.md +2 -0
- package/extensions.js +13 -8
- package/package.json +8 -8
- package/services.d.ts +2 -0
- package/services.js +1 -0
- package/vscode/src/vs/base/browser/dom.js +5 -2
- package/vscode/src/vs/base/browser/ui/splitview/splitview.js +1 -1
- package/vscode/src/vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature.js +55 -4
- package/vscode/src/vs/editor/contrib/colorPicker/browser/colorPickerWidget.js +14 -0
- package/vscode/src/vs/platform/secrets/common/secrets.d.ts +10 -1
- package/vscode/src/vs/platform/secrets/common/secrets.js +125 -6
package/README.md
CHANGED
|
@@ -238,6 +238,8 @@ Additionally, several packages that include the VSCode version of some services
|
|
|
238
238
|
- Update detection, release notes...
|
|
239
239
|
- **Localization**
|
|
240
240
|
- Register callbacks to update the display language from the VSCode UI (either from the `Set Display Language` command or from the extension gallery extension packs)
|
|
241
|
+
- **Secret Storage**
|
|
242
|
+
- Storage of secrets for extensions, will store by default in-memory. You can pass a custom implementation as part of the workbench construction options when initializing monaco services (under `secretStorageProvider`).
|
|
241
243
|
|
|
242
244
|
Usage:
|
|
243
245
|
|
package/extensions.js
CHANGED
|
@@ -10,8 +10,9 @@ import { parse } from './vscode/src/vs/base/common/json.js';
|
|
|
10
10
|
import { IFileService } from './vscode/src/vs/platform/files/common/files.js';
|
|
11
11
|
import { IInstantiationService } from './vscode/src/vs/platform/instantiation/common/instantiation.js';
|
|
12
12
|
import { IWorkbenchExtensionEnablementService } from './vscode/src/vs/workbench/services/extensionManagement/common/extensionManagement.js';
|
|
13
|
+
import { StandaloneServices } from './vscode/src/vs/editor/standalone/browser/standaloneServices.js';
|
|
13
14
|
import { CustomSchemas, registerExtensionFile } from '@codingame/monaco-vscode-files-service-override';
|
|
14
|
-
import {
|
|
15
|
+
import { waitServicesReady } from './lifecycle.js';
|
|
15
16
|
import { ExtensionManifestTranslator } from './tools/l10n.js';
|
|
16
17
|
import { throttle, memoized } from './tools.js';
|
|
17
18
|
import { setDefaultApi } from './api.js';
|
|
@@ -38,12 +39,14 @@ function registerExtensionFileUrl(extensionLocation, filePath, url, mimeType) {
|
|
|
38
39
|
return fileDisposable;
|
|
39
40
|
}
|
|
40
41
|
const deltaExtensions = throttle(async ({ toAdd, toRemove }) => {
|
|
41
|
-
|
|
42
|
+
await waitServicesReady();
|
|
43
|
+
const extensionService = StandaloneServices.get(IExtensionService);
|
|
42
44
|
await extensionService.deltaExtensions(toAdd, toRemove);
|
|
43
45
|
}, (a, b) => ({ toAdd: [...a.toAdd, ...b.toAdd], toRemove: [...a.toRemove, ...b.toRemove] }), 0);
|
|
44
46
|
async function registerRemoteExtension(directory) {
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
+
await waitServicesReady();
|
|
48
|
+
const fileService = StandaloneServices.get(IFileService);
|
|
49
|
+
const remoteAuthority = StandaloneServices.get(IWorkbenchEnvironmentService).remoteAuthority;
|
|
47
50
|
const content = await fileService.readFile(joinPath(( URI.from(
|
|
48
51
|
{ scheme: Schemas.vscodeRemote, authority: remoteAuthority, path: directory }
|
|
49
52
|
)), 'package.json'));
|
|
@@ -62,12 +65,13 @@ function registerExtension(manifest, extHostKind, { path = '/', system = false,
|
|
|
62
65
|
const id = getExtensionId(manifest.publisher, manifest.name);
|
|
63
66
|
const location = ( URI.from({ scheme: CustomSchemas.extensionFile, authority: id, path }));
|
|
64
67
|
const addExtensionPromise = (async () => {
|
|
65
|
-
|
|
68
|
+
await waitServicesReady();
|
|
69
|
+
const remoteAuthority = StandaloneServices.get(IWorkbenchEnvironmentService).remoteAuthority;
|
|
66
70
|
let realLocation = location;
|
|
67
71
|
if (extHostKind === 3 ) {
|
|
68
72
|
realLocation = ( URI.from({ scheme: Schemas.vscodeRemote, authority: remoteAuthority, path }));
|
|
69
73
|
}
|
|
70
|
-
const instantiationService =
|
|
74
|
+
const instantiationService = StandaloneServices.get(IInstantiationService);
|
|
71
75
|
const translator = instantiationService.createInstance(ExtensionManifestTranslator);
|
|
72
76
|
const localizedManifest = await translator.translateManifest(realLocation, manifest);
|
|
73
77
|
const extension = {
|
|
@@ -89,7 +93,7 @@ function registerExtension(manifest, extHostKind, { path = '/', system = false,
|
|
|
89
93
|
if (extHostKind !== 3 ) {
|
|
90
94
|
extensions.push(extension);
|
|
91
95
|
}
|
|
92
|
-
const extensionEnablementService =
|
|
96
|
+
const extensionEnablementService = StandaloneServices.get(IWorkbenchExtensionEnablementService);
|
|
93
97
|
if (extensionEnablementService.isEnabled(extension)) {
|
|
94
98
|
await deltaExtensions({ toAdd: [extension], toRemove: [] });
|
|
95
99
|
}
|
|
@@ -101,7 +105,8 @@ function registerExtension(manifest, extHostKind, { path = '/', system = false,
|
|
|
101
105
|
await addExtensionPromise;
|
|
102
106
|
},
|
|
103
107
|
async isEnabled() {
|
|
104
|
-
|
|
108
|
+
await waitServicesReady();
|
|
109
|
+
const extensionEnablementService = StandaloneServices.get(IWorkbenchExtensionEnablementService);
|
|
105
110
|
const extension = await addExtensionPromise;
|
|
106
111
|
return extensionEnablementService.isEnabled(extension);
|
|
107
112
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codingame/monaco-vscode-api",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.2.0",
|
|
4
4
|
"description": "VSCode public API plugged on the monaco editor",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"author": {
|
|
@@ -94,12 +94,12 @@
|
|
|
94
94
|
}
|
|
95
95
|
},
|
|
96
96
|
"dependencies": {
|
|
97
|
-
"@codingame/monaco-vscode-
|
|
98
|
-
"@codingame/monaco-vscode-files-service-override": "4.
|
|
99
|
-
"@codingame/monaco-vscode-
|
|
100
|
-
"@codingame/monaco-vscode-environment-service-override": "4.
|
|
101
|
-
"@codingame/monaco-vscode-layout-service-override": "4.
|
|
102
|
-
"@codingame/monaco-vscode-host-service-override": "4.
|
|
103
|
-
"@codingame/monaco-vscode-base-service-override": "4.
|
|
97
|
+
"@codingame/monaco-vscode-extensions-service-override": "4.2.0",
|
|
98
|
+
"@codingame/monaco-vscode-files-service-override": "4.2.0",
|
|
99
|
+
"@codingame/monaco-vscode-quickaccess-service-override": "4.2.0",
|
|
100
|
+
"@codingame/monaco-vscode-environment-service-override": "4.2.0",
|
|
101
|
+
"@codingame/monaco-vscode-layout-service-override": "4.2.0",
|
|
102
|
+
"@codingame/monaco-vscode-host-service-override": "4.2.0",
|
|
103
|
+
"@codingame/monaco-vscode-base-service-override": "4.2.0"
|
|
104
104
|
}
|
|
105
105
|
}
|
package/services.d.ts
CHANGED
|
@@ -81,6 +81,8 @@ export { IExplorerService } from './vscode/src/vs/workbench/contrib/files/browse
|
|
|
81
81
|
export { IStatusbarService } from './vscode/src/vs/workbench/services/statusbar/browser/statusbar.js';
|
|
82
82
|
export { ITitleService } from './vscode/src/vs/workbench/services/title/browser/titleService.js';
|
|
83
83
|
export { IBannerService } from './vscode/src/vs/workbench/services/banner/browser/bannerService.js';
|
|
84
|
+
export { ISecretStorageProvider, ISecretStorageService } from './vscode/src/vs/platform/secrets/common/secrets.js';
|
|
85
|
+
export { IProductConfiguration } from './vscode/src/vs/base/common/product.js';
|
|
84
86
|
|
|
85
87
|
declare function initialize(overrides: IEditorOverrideServices, container?: HTMLElement, configuration?: IWorkbenchConstructionOptions, env?: EnvironmentOverride): Promise<void>;
|
|
86
88
|
declare function getService<T>(identifier: ServiceIdentifier<T>): Promise<T>;
|
package/services.js
CHANGED
|
@@ -146,6 +146,7 @@ export { ITitleService } from './vscode/src/vs/workbench/services/title/browser/
|
|
|
146
146
|
export { IBannerService } from './vscode/src/vs/workbench/services/banner/browser/bannerService.js';
|
|
147
147
|
export { IWorkspaceTrustEnablementService, IWorkspaceTrustManagementService, IWorkspaceTrustRequestService } from './vscode/src/vs/platform/workspace/common/workspaceTrust.js';
|
|
148
148
|
export { IKeybindingService } from './vscode/src/vs/platform/keybinding/common/keybinding.js';
|
|
149
|
+
export { ISecretStorageService } from './vscode/src/vs/platform/secrets/common/secrets.js';
|
|
149
150
|
export { IDialogService, IFileDialogService } from './vscode/src/vs/platform/dialogs/common/dialogs.js';
|
|
150
151
|
async function initialize(overrides, container = document.body, configuration = {}, env) {
|
|
151
152
|
checkServicesNotInitialized();
|
|
@@ -101,7 +101,7 @@ class DomListener {
|
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
function addDisposableListener(node, type, handler, useCaptureOrOptions) {
|
|
104
|
-
return
|
|
104
|
+
return new DomListener(node, type, handler, useCaptureOrOptions);
|
|
105
105
|
}
|
|
106
106
|
function _wrapAsStandardMouseEvent(targetWindow, handler) {
|
|
107
107
|
return function (e) {
|
|
@@ -134,6 +134,9 @@ const addStandardDisposableGenericMouseUpListener = function addStandardDisposab
|
|
|
134
134
|
function addDisposableGenericMouseDownListener(node, handler, useCapture) {
|
|
135
135
|
return addDisposableListener(node, isIOS && BrowserFeatures.pointerEvents ? EventType.POINTER_DOWN : EventType.MOUSE_DOWN, handler, useCapture);
|
|
136
136
|
}
|
|
137
|
+
function addDisposableGenericMouseMoveListener(node, handler, useCapture) {
|
|
138
|
+
return addDisposableListener(node, isIOS && BrowserFeatures.pointerEvents ? EventType.POINTER_MOVE : EventType.MOUSE_MOVE, handler, useCapture);
|
|
139
|
+
}
|
|
137
140
|
function addDisposableGenericMouseUpListener(node, handler, useCapture) {
|
|
138
141
|
return addDisposableListener(node, isIOS && BrowserFeatures.pointerEvents ? EventType.POINTER_UP : EventType.MOUSE_UP, handler, useCapture);
|
|
139
142
|
}
|
|
@@ -1537,4 +1540,4 @@ function trackAttributes(from, to, filter) {
|
|
|
1537
1540
|
}));
|
|
1538
1541
|
return disposables;
|
|
1539
1542
|
}
|
|
1540
|
-
export { $, DetectedFullscreenMode, Dimension, DragAndDropObserver, EventHelper, EventType, ModifierKeyEmitter, Namespace, WindowIdleValue, WindowIntervalTimer, addDisposableGenericMouseDownListener, addDisposableGenericMouseUpListener, addDisposableListener, addDisposableThrottledListener, addStandardDisposableGenericMouseDownListener, addStandardDisposableGenericMouseUpListener, addStandardDisposableListener, after, animate, append, asCSSPropertyValue, asCSSUrl, asCssValueWithDefault, basicMarkupHtmlTags, clearNode, cloneGlobalStylesheets, computeScreenAwareSize, copyAttributes, createCSSRule, createLinkElement, createMetaElement, createStyleSheet, createStyleSheet2, detectFullscreen, disposableWindowInterval, finalHandler, findParentWithClass, getActiveDocument, getActiveElement, getActiveWindow, getClientArea, getComputedStyle, getContentHeight, getContentWidth, getDocument, getDomNodePagePosition, getDomNodeZoomLevel, getLargestChildWidth, getShadowRoot, getTopLeftOffset, getTotalHeight, getTotalScrollWidth, getTotalWidth, getWindow, getWindowById, getWindowId, getWindows, getWindowsCount, h, hasParentWithClass, hasWindow, hide, hookDomPurifyHrefAndSrcSanitizer, isActiveDocument, isActiveElement, isAncestor, isAncestorOfActiveElement, isAncestorUsingFlowTo, isDragEvent, isEventLike, isGlobalStylesheet, isInShadowDOM, isKeyboardEvent, isMouseEvent, isPointerEvent, isShadowRoot, measure, modify, multibyteAwareBtoa, onDidRegisterWindow, onDidUnregisterWindow, onWillUnregisterWindow, position, prepend, registerWindow, removeCSSRulesContainingSelector, reset, restoreParentsScrollTop, runAtThisOrScheduleAtNextAnimationFrame, runWhenWindowIdle, safeInnerHtml, saveParentsScrollTop, scheduleAtNextAnimationFrame, setParentFlowTo, setVisibility, sharedMutationObserver, show, size, trackAttributes, trackFocus, triggerDownload, triggerUpload, windowOpenNoOpener, windowOpenPopup, windowOpenWithSuccess };
|
|
1543
|
+
export { $, DetectedFullscreenMode, Dimension, DragAndDropObserver, EventHelper, EventType, ModifierKeyEmitter, Namespace, WindowIdleValue, WindowIntervalTimer, addDisposableGenericMouseDownListener, addDisposableGenericMouseMoveListener, addDisposableGenericMouseUpListener, addDisposableListener, addDisposableThrottledListener, addStandardDisposableGenericMouseDownListener, addStandardDisposableGenericMouseUpListener, addStandardDisposableListener, after, animate, append, asCSSPropertyValue, asCSSUrl, asCssValueWithDefault, basicMarkupHtmlTags, clearNode, cloneGlobalStylesheets, computeScreenAwareSize, copyAttributes, createCSSRule, createLinkElement, createMetaElement, createStyleSheet, createStyleSheet2, detectFullscreen, disposableWindowInterval, finalHandler, findParentWithClass, getActiveDocument, getActiveElement, getActiveWindow, getClientArea, getComputedStyle, getContentHeight, getContentWidth, getDocument, getDomNodePagePosition, getDomNodeZoomLevel, getLargestChildWidth, getShadowRoot, getTopLeftOffset, getTotalHeight, getTotalScrollWidth, getTotalWidth, getWindow, getWindowById, getWindowId, getWindows, getWindowsCount, h, hasParentWithClass, hasWindow, hide, hookDomPurifyHrefAndSrcSanitizer, isActiveDocument, isActiveElement, isAncestor, isAncestorOfActiveElement, isAncestorUsingFlowTo, isDragEvent, isEventLike, isGlobalStylesheet, isInShadowDOM, isKeyboardEvent, isMouseEvent, isPointerEvent, isShadowRoot, measure, modify, multibyteAwareBtoa, onDidRegisterWindow, onDidUnregisterWindow, onWillUnregisterWindow, position, prepend, registerWindow, removeCSSRulesContainingSelector, reset, restoreParentsScrollTop, runAtThisOrScheduleAtNextAnimationFrame, runWhenWindowIdle, safeInnerHtml, saveParentsScrollTop, scheduleAtNextAnimationFrame, setParentFlowTo, setVisibility, sharedMutationObserver, show, size, trackAttributes, trackFocus, triggerDownload, triggerUpload, windowOpenNoOpener, windowOpenPopup, windowOpenWithSuccess };
|
|
@@ -5,7 +5,7 @@ import { SmoothScrollableElement } from '../scrollbar/scrollableElement.js';
|
|
|
5
5
|
import { range, pushToStart, pushToEnd } from '../../../common/arrays.js';
|
|
6
6
|
import { Color } from '../../../common/color.js';
|
|
7
7
|
import { Emitter, Event } from '../../../common/event.js';
|
|
8
|
-
import { Disposable,
|
|
8
|
+
import { Disposable, combinedDisposable, dispose, toDisposable } from '../../../common/lifecycle.js';
|
|
9
9
|
import { clamp } from '../../../common/numbers.js';
|
|
10
10
|
import { Scrollable } from '../../../common/scrollable.js';
|
|
11
11
|
import { isUndefined } from '../../../common/types.js';
|
package/vscode/src/vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature.js
CHANGED
|
@@ -274,6 +274,7 @@ class CollapsedCodeOverlayWidget extends ViewZoneOverlayWidget {
|
|
|
274
274
|
}
|
|
275
275
|
}
|
|
276
276
|
}));
|
|
277
|
+
const editor = this._editor;
|
|
277
278
|
this._register(addDisposableListener(this._nodes.top, 'mousedown', e => {
|
|
278
279
|
if (e.button !== 0) {
|
|
279
280
|
return;
|
|
@@ -281,9 +282,29 @@ class CollapsedCodeOverlayWidget extends ViewZoneOverlayWidget {
|
|
|
281
282
|
this._nodes.top.classList.toggle('dragging', true);
|
|
282
283
|
this._nodes.root.classList.toggle('dragging', true);
|
|
283
284
|
e.preventDefault();
|
|
284
|
-
|
|
285
|
+
const startTop = e.clientY;
|
|
286
|
+
let didMove = false;
|
|
287
|
+
const cur = this._unchangedRegion.visibleLineCountTop.get();
|
|
285
288
|
this._unchangedRegion.isDragged.set('top', undefined);
|
|
286
|
-
getWindow(this._nodes.top);
|
|
289
|
+
const window = getWindow(this._nodes.top);
|
|
290
|
+
const mouseMoveListener = addDisposableListener(window, 'mousemove', e => {
|
|
291
|
+
const currentTop = e.clientY;
|
|
292
|
+
const delta = currentTop - startTop;
|
|
293
|
+
didMove = didMove || Math.abs(delta) > 2;
|
|
294
|
+
const lineDelta = Math.round(delta / editor.getOption(67 ));
|
|
295
|
+
const newVal = Math.max(0, Math.min(cur + lineDelta, this._unchangedRegion.getMaxVisibleLineCountTop()));
|
|
296
|
+
this._unchangedRegion.visibleLineCountTop.set(newVal, undefined);
|
|
297
|
+
});
|
|
298
|
+
const mouseUpListener = addDisposableListener(window, 'mouseup', e => {
|
|
299
|
+
if (!didMove) {
|
|
300
|
+
this._unchangedRegion.showMoreAbove(this._options.hideUnchangedRegionsRevealLineCount.get(), undefined);
|
|
301
|
+
}
|
|
302
|
+
this._nodes.top.classList.toggle('dragging', false);
|
|
303
|
+
this._nodes.root.classList.toggle('dragging', false);
|
|
304
|
+
this._unchangedRegion.isDragged.set(undefined, undefined);
|
|
305
|
+
mouseMoveListener.dispose();
|
|
306
|
+
mouseUpListener.dispose();
|
|
307
|
+
});
|
|
287
308
|
}));
|
|
288
309
|
this._register(addDisposableListener(this._nodes.bottom, 'mousedown', e => {
|
|
289
310
|
if (e.button !== 0) {
|
|
@@ -292,9 +313,39 @@ class CollapsedCodeOverlayWidget extends ViewZoneOverlayWidget {
|
|
|
292
313
|
this._nodes.bottom.classList.toggle('dragging', true);
|
|
293
314
|
this._nodes.root.classList.toggle('dragging', true);
|
|
294
315
|
e.preventDefault();
|
|
295
|
-
|
|
316
|
+
const startTop = e.clientY;
|
|
317
|
+
let didMove = false;
|
|
318
|
+
const cur = this._unchangedRegion.visibleLineCountBottom.get();
|
|
296
319
|
this._unchangedRegion.isDragged.set('bottom', undefined);
|
|
297
|
-
getWindow(this._nodes.bottom);
|
|
320
|
+
const window = getWindow(this._nodes.bottom);
|
|
321
|
+
const mouseMoveListener = addDisposableListener(window, 'mousemove', e => {
|
|
322
|
+
const currentTop = e.clientY;
|
|
323
|
+
const delta = currentTop - startTop;
|
|
324
|
+
didMove = didMove || Math.abs(delta) > 2;
|
|
325
|
+
const lineDelta = Math.round(delta / editor.getOption(67 ));
|
|
326
|
+
const newVal = Math.max(0, Math.min(cur - lineDelta, this._unchangedRegion.getMaxVisibleLineCountBottom()));
|
|
327
|
+
const top = this._unchangedRegionRange.endLineNumberExclusive > editor.getModel().getLineCount()
|
|
328
|
+
? editor.getContentHeight()
|
|
329
|
+
: editor.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive);
|
|
330
|
+
this._unchangedRegion.visibleLineCountBottom.set(newVal, undefined);
|
|
331
|
+
const top2 = this._unchangedRegionRange.endLineNumberExclusive > editor.getModel().getLineCount()
|
|
332
|
+
? editor.getContentHeight()
|
|
333
|
+
: editor.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive);
|
|
334
|
+
editor.setScrollTop(editor.getScrollTop() + (top2 - top));
|
|
335
|
+
});
|
|
336
|
+
const mouseUpListener = addDisposableListener(window, 'mouseup', e => {
|
|
337
|
+
this._unchangedRegion.isDragged.set(undefined, undefined);
|
|
338
|
+
if (!didMove) {
|
|
339
|
+
const top = editor.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive);
|
|
340
|
+
this._unchangedRegion.showMoreBelow(this._options.hideUnchangedRegionsRevealLineCount.get(), undefined);
|
|
341
|
+
const top2 = editor.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive);
|
|
342
|
+
editor.setScrollTop(editor.getScrollTop() + (top2 - top));
|
|
343
|
+
}
|
|
344
|
+
this._nodes.bottom.classList.toggle('dragging', false);
|
|
345
|
+
this._nodes.root.classList.toggle('dragging', false);
|
|
346
|
+
mouseMoveListener.dispose();
|
|
347
|
+
mouseUpListener.dispose();
|
|
348
|
+
});
|
|
298
349
|
}));
|
|
299
350
|
this._register(autorun(reader => {
|
|
300
351
|
const children = [];
|
|
@@ -203,6 +203,14 @@ class SaturationBox extends Disposable {
|
|
|
203
203
|
this.onDidChangePosition(e.offsetX, e.offsetY);
|
|
204
204
|
}
|
|
205
205
|
this.monitor.startMonitoring(e.target, e.pointerId, e.buttons, event => this.onDidChangePosition(event.pageX - origin.left, event.pageY - origin.top), () => null);
|
|
206
|
+
const pointerUpListener = addDisposableListener(e.target.ownerDocument, EventType.POINTER_UP, () => {
|
|
207
|
+
this._onColorFlushed.fire();
|
|
208
|
+
pointerUpListener.dispose();
|
|
209
|
+
if (this.monitor) {
|
|
210
|
+
this.monitor.stopMonitoring(true);
|
|
211
|
+
this.monitor = null;
|
|
212
|
+
}
|
|
213
|
+
}, true);
|
|
206
214
|
}
|
|
207
215
|
onDidChangePosition(left, top) {
|
|
208
216
|
const s = Math.max(0, Math.min(1, left / this.width));
|
|
@@ -293,6 +301,12 @@ class Strip extends Disposable {
|
|
|
293
301
|
this.onDidChangeTop(e.offsetY);
|
|
294
302
|
}
|
|
295
303
|
monitor.startMonitoring(e.target, e.pointerId, e.buttons, event => this.onDidChangeTop(event.pageY - origin.top), () => null);
|
|
304
|
+
const pointerUpListener = addDisposableListener(e.target.ownerDocument, EventType.POINTER_UP, () => {
|
|
305
|
+
this._onColorFlushed.fire();
|
|
306
|
+
pointerUpListener.dispose();
|
|
307
|
+
monitor.stopMonitoring(true);
|
|
308
|
+
this.domNode.classList.remove('grabbing');
|
|
309
|
+
}, true);
|
|
296
310
|
}
|
|
297
311
|
onDidChangeTop(top) {
|
|
298
312
|
const value = Math.max(0, Math.min(1, 1 - (top / this.height)));
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { ServiceIdentifier } from '../../instantiation/common/instantiation.js';
|
|
2
|
+
import { Event } from '../../../base/common/event.js';
|
|
3
|
+
|
|
1
4
|
interface ISecretStorageProvider {
|
|
2
5
|
type: 'in-memory' | 'persisted' | 'unknown';
|
|
3
6
|
get(key: string): Promise<string | undefined>;
|
|
@@ -5,4 +8,10 @@ interface ISecretStorageProvider {
|
|
|
5
8
|
delete(key: string): Promise<void>;
|
|
6
9
|
}
|
|
7
10
|
|
|
8
|
-
|
|
11
|
+
declare const ISecretStorageService: ServiceIdentifier<ISecretStorageService>;
|
|
12
|
+
interface ISecretStorageService extends ISecretStorageProvider {
|
|
13
|
+
readonly _serviceBrand: undefined;
|
|
14
|
+
onDidChangeSecret: Event<string>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { type ISecretStorageProvider, ISecretStorageService };
|
|
@@ -1,8 +1,127 @@
|
|
|
1
|
-
import '
|
|
1
|
+
import { __decorate, __param } from '../../../../../../external/tslib/tslib.es6.js';
|
|
2
|
+
import { SequencerByKey } from '../../../base/common/async.js';
|
|
3
|
+
import { IEncryptionService } from '../../encryption/common/encryptionService.js';
|
|
2
4
|
import { createDecorator } from '../../instantiation/common/instantiation.js';
|
|
3
|
-
import '../../storage/common/storage.js';
|
|
4
|
-
import '../../../base/common/event.js';
|
|
5
|
-
import '../../log/common/log.js';
|
|
6
|
-
import '../../../base/common/lifecycle.js';
|
|
5
|
+
import { InMemoryStorageService, IStorageService } from '../../storage/common/storage.js';
|
|
6
|
+
import { Emitter } from '../../../base/common/event.js';
|
|
7
|
+
import { ILogService } from '../../log/common/log.js';
|
|
8
|
+
import { Disposable, DisposableStore } from '../../../base/common/lifecycle.js';
|
|
9
|
+
import { Lazy } from '../../../base/common/lazy.js';
|
|
7
10
|
const ISecretStorageService = ( createDecorator('secretStorageService'));
|
|
8
|
-
|
|
11
|
+
let BaseSecretStorageService = class BaseSecretStorageService extends Disposable {
|
|
12
|
+
constructor(_useInMemoryStorage, _storageService, _encryptionService, _logService) {
|
|
13
|
+
super();
|
|
14
|
+
this._useInMemoryStorage = _useInMemoryStorage;
|
|
15
|
+
this._storageService = _storageService;
|
|
16
|
+
this._encryptionService = _encryptionService;
|
|
17
|
+
this._logService = _logService;
|
|
18
|
+
this._storagePrefix = 'secret://';
|
|
19
|
+
this.onDidChangeSecretEmitter = this._register(( new Emitter()));
|
|
20
|
+
this.onDidChangeSecret = this.onDidChangeSecretEmitter.event;
|
|
21
|
+
this._sequencer = ( new SequencerByKey());
|
|
22
|
+
this._type = 'unknown';
|
|
23
|
+
this._onDidChangeValueDisposable = this._register(( new DisposableStore()));
|
|
24
|
+
this._lazyStorageService = ( new Lazy(() => this.initialize()));
|
|
25
|
+
}
|
|
26
|
+
get type() {
|
|
27
|
+
return this._type;
|
|
28
|
+
}
|
|
29
|
+
get resolvedStorageService() {
|
|
30
|
+
return this._lazyStorageService.value;
|
|
31
|
+
}
|
|
32
|
+
get(key) {
|
|
33
|
+
return this._sequencer.queue(key, async () => {
|
|
34
|
+
const storageService = await this.resolvedStorageService;
|
|
35
|
+
const fullKey = this.getKey(key);
|
|
36
|
+
this._logService.trace('[secrets] getting secret for key:', fullKey);
|
|
37
|
+
const encrypted = storageService.get(fullKey, -1 );
|
|
38
|
+
if (!encrypted) {
|
|
39
|
+
this._logService.trace('[secrets] no secret found for key:', fullKey);
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
this._logService.trace('[secrets] decrypting gotten secret for key:', fullKey);
|
|
44
|
+
const result = this._type === 'in-memory'
|
|
45
|
+
? encrypted
|
|
46
|
+
: await this._encryptionService.decrypt(encrypted);
|
|
47
|
+
this._logService.trace('[secrets] decrypted secret for key:', fullKey);
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
this._logService.error(e);
|
|
52
|
+
this.delete(key);
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
set(key, value) {
|
|
58
|
+
return this._sequencer.queue(key, async () => {
|
|
59
|
+
const storageService = await this.resolvedStorageService;
|
|
60
|
+
this._logService.trace('[secrets] encrypting secret for key:', key);
|
|
61
|
+
let encrypted;
|
|
62
|
+
try {
|
|
63
|
+
encrypted = this._type === 'in-memory'
|
|
64
|
+
? value
|
|
65
|
+
: await this._encryptionService.encrypt(value);
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
this._logService.error(e);
|
|
69
|
+
throw e;
|
|
70
|
+
}
|
|
71
|
+
const fullKey = this.getKey(key);
|
|
72
|
+
this._logService.trace('[secrets] storing encrypted secret for key:', fullKey);
|
|
73
|
+
storageService.store(fullKey, encrypted, -1 , 1 );
|
|
74
|
+
this._logService.trace('[secrets] stored encrypted secret for key:', fullKey);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
delete(key) {
|
|
78
|
+
return this._sequencer.queue(key, async () => {
|
|
79
|
+
const storageService = await this.resolvedStorageService;
|
|
80
|
+
const fullKey = this.getKey(key);
|
|
81
|
+
this._logService.trace('[secrets] deleting secret for key:', fullKey);
|
|
82
|
+
storageService.remove(fullKey, -1 );
|
|
83
|
+
this._logService.trace('[secrets] deleted secret for key:', fullKey);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
async initialize() {
|
|
87
|
+
let storageService;
|
|
88
|
+
if (!this._useInMemoryStorage && (await this._encryptionService.isEncryptionAvailable())) {
|
|
89
|
+
this._logService.trace(`[SecretStorageService] Encryption is available, using persisted storage`);
|
|
90
|
+
this._type = 'persisted';
|
|
91
|
+
storageService = this._storageService;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
if (this._type === 'in-memory') {
|
|
95
|
+
return this._storageService;
|
|
96
|
+
}
|
|
97
|
+
this._logService.trace('[SecretStorageService] Encryption is not available, falling back to in-memory storage');
|
|
98
|
+
this._type = 'in-memory';
|
|
99
|
+
storageService = this._register(( new InMemoryStorageService()));
|
|
100
|
+
}
|
|
101
|
+
this._onDidChangeValueDisposable.clear();
|
|
102
|
+
this._onDidChangeValueDisposable.add(storageService.onDidChangeValue(-1 , undefined, this._onDidChangeValueDisposable)(e => {
|
|
103
|
+
this.onDidChangeValue(e.key);
|
|
104
|
+
}));
|
|
105
|
+
return storageService;
|
|
106
|
+
}
|
|
107
|
+
reinitialize() {
|
|
108
|
+
this._lazyStorageService = ( new Lazy(() => this.initialize()));
|
|
109
|
+
}
|
|
110
|
+
onDidChangeValue(key) {
|
|
111
|
+
if (!key.startsWith(this._storagePrefix)) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const secretKey = key.slice(this._storagePrefix.length);
|
|
115
|
+
this._logService.trace(`[SecretStorageService] Notifying change in value for secret: ${secretKey}`);
|
|
116
|
+
this.onDidChangeSecretEmitter.fire(secretKey);
|
|
117
|
+
}
|
|
118
|
+
getKey(key) {
|
|
119
|
+
return `${this._storagePrefix}${key}`;
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
BaseSecretStorageService = ( __decorate([
|
|
123
|
+
( __param(1, IStorageService)),
|
|
124
|
+
( __param(2, IEncryptionService)),
|
|
125
|
+
( __param(3, ILogService))
|
|
126
|
+
], BaseSecretStorageService));
|
|
127
|
+
export { BaseSecretStorageService, ISecretStorageService };
|